先来截图:

由许多个自定义的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()方法来显示所有的砖块。
浙公网安备 33010602011771号