先来截图:

 

由许多个自定义的canvas的小砖块组成,但其中的雷的随机位置没有解决。部分功能没有完善。

下面是主要代码.分享一下:

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Input;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media.Imaging;

namespace xiaohai.MineSweepting
{
public class Tile : Canvas
{
static double sizeW = 32;
static double sizeH = 32;
static double border = 6;
TextBlock txt;
Boolean ismine;
//是否有雷*****************************************************************
Canvas cav;
Border bor1, bor2,bor3;
bool showed ; //是否已经显示完有雷或没雷****************************************************************
static RoutedEvent SuccessedEvent;
static RoutedEvent FailedEvent;

public event RoutedEventHandler Successed
{
add { AddHandler(SuccessedEvent, value); }
remove { RemoveHandler (SuccessedEvent ,value );}
}

public event RoutedEventHandler Failed
{
add { AddHandler(FailedEvent, value); }
remove { RemoveHandler(FailedEvent, value); }
}

void OnSuccess()
{
RoutedEventArgs e
=new RoutedEventArgs();
e.RoutedEvent
= SuccessedEvent;
e.Source
= this;
RaiseEvent(e);


}

void OnFail()
{
RoutedEventArgs e
= new RoutedEventArgs();
e.RoutedEvent
= FailedEvent;
e.Source
= this;
RaiseEvent(e);


}
static Tile()
{
SuccessedEvent
= EventManager.RegisterRoutedEvent("Successed", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(Tile));
FailedEvent
= EventManager.RegisterRoutedEvent("Failed", RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(Tile));
}

public Tile()
{
Width
= sizeW;
Height
= sizeH;

cav
= new Canvas(); //初始状态时********************************************************************
Polygon poly = new Polygon();
poly.Stroke
= SystemColors.ControlBrush;
poly.Points
= new PointCollection() {
new Point (0,0),new Point (sizeW ,0 ),new Point ( sizeW - border ,border ),
new Point (border ,border ),new Point (border ,sizeH -border ),new Point (0,sizeH )

};
poly.Fill
= SystemColors.ControlLightBrush ;
cav.Children.Add(poly);

poly
= new Polygon();
poly.Stroke
= SystemColors.ControlBrush;
poly.Points
= new PointCollection() {
new Point (sizeW ,sizeH ),new Point (sizeW ,0),new Point (sizeW -border ,border ),
new Point (sizeW -border ,sizeH -border ),new Point (border ,sizeH -border ),new Point (0,sizeH )

};
poly.Fill
= SystemColors.ControlDarkBrush;
cav.Children.Add(poly);

Border bor
= new Border();
bor.Width
= sizeW -2*border;
bor .Height
=sizeH -2*border;
bor.Background
= SystemColors.ControlDarkBrush ;
cav.Children.Add(bor);
Canvas.SetLeft(bor, border);
Canvas.SetTop(bor, border);
Brush b
= new SolidColorBrush(Colors.Yellow);
//***************************************************************************************************************



bor1
= new Border(); //按钮点击过程完成时且无雷*********************************************************
bor1.Width = sizeW;
bor1.Height
= sizeH;
bor1.Background
= new LinearGradientBrush(Colors.GreenYellow, Colors.Green, 45);

txt
= new TextBlock();
txt.FontSize
= 24;
txt.Foreground
= SystemColors .ControlTextBrush ;
txt.HorizontalAlignment
= HorizontalAlignment.Center;
txt.VerticalAlignment
= VerticalAlignment.Center;
bor1.Child
= txt;
Children.Add(cav);


bor2
= new Border(); //按钮点击过程完成时且有雷*************************************************
bor2.Width = sizeW;
bor2.Height
= sizeH;
Image img
= new Image();
BitmapImage bimg
= new BitmapImage(new Uri("Fetion.ico", UriKind.Relative));
img.Source
= bimg;
bor2.Child
= img;


bor3
= new Border(); //鼠标左键按下进行选择时********************************************************************
bor3.Width = sizeW;
bor3.Height
= sizeH;
bor3.Background
= new SolidColorBrush(Colors.Green);

}
public string Text
{
set { txt.Text = value; }
get { return (string)txt.Text; }
}
public Boolean IsMine
{
set { ismine = value; }
get { return ismine; }
}

protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
if (!showed)
{
if (ismine)
{

Children.Add(bor2);
showed
= true;
OnFail();
}
else
{

Children.Clear();
Children.Add(bor1);
showed
= true;
OnSuccess();
}
}
}
protected override void OnMouseEnter(MouseEventArgs e)
{
if (!showed & e.LeftButton==MouseButtonState .Pressed )
{

Children.Clear();
Children.Add(bor3);
}
}

protected override void OnMouseLeave(MouseEventArgs e)
{
if (!showed & e.LeftButton == MouseButtonState.Pressed)
{
Children.Clear();
Children.Add(cav);
}
}

public void Show() //显示**************************************************************************
{
if (!showed)
{
if (ismine)
{

Children.Add(bor2);
showed
= true;

}
else
{

Children.Clear();
Children.Add(bor1);
showed
= true;

}
}
}

}
}

  上面只是砖块的代码。逻辑代码不在其中。四种不同的Border对象,用于表现不同的动作。包括选择的是雷或不是。公布了一个show()方法来显示所有的砖块。