我必须使用WPF应用程序进行某种类型的游戏,其中包含一些颜色框矩阵(例如10x10)。点击一些它必须消除自己和周围的相同颜色的框,如果有超过3,并在消除后这些框授予一些随机颜色。
我在WPF应用程序中相当新,但我对C#编程有一些了解,我无法弄清楚应该从哪里开始。对我来说最困难的部分是"产卵"这个盒子就像一个矩阵一样使用它。
到目前为止,我发现了一些project,我认为它会对我有所帮助,但不是真的。
有人可以从我可以开始的地方导航,这是最相关的方式。
谢谢。
答案 0 :(得分:0)
ItemsControl + UniformGrid作为Panel是显示矩阵
的不错选择视图
<ItemsControl Name="Board">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate >
<UniformGrid Rows="10" Columns="10"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="Transparent"
BorderBrush="Black"
BorderThickness="1"
MouseDown="CellClick"
Margin="2"
Tag="{Binding}">
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
代码隐藏
public partial class MainWindow : Window
{
List<Point> _board;
public MainWindow()
{
InitializeComponent();
int rows = 10;
int columns = 10;
_board = new List<Point>();
for(int r = 0; r<rows; r++)
for (int c = 0; c < columns; c++)
_board.Add(new Point(r, c));
Board.ItemsSource = _board;
}
private void CellClick(object sender, MouseButtonEventArgs e)
{
var border = (Border)sender;
var point = (Point) border.Tag;
}
}
您可以创建和使用更复杂的类型而不是Point并改进ItemTemplate以继续开发。当前的ItemTemplate只不过是一个矩形
我使用代码隐藏进行演示,但在wpf MVVM中采用首选方法
<小时/> 编辑扩展示例
在大多数情况下,您不必直接使用UI元素
支持不同的颜色我将创建一个自定义类
public class MatrixElement
{
private string _color;
public MatrixElement(int x, int y)
{
X = x;
Y = y;
}
public int X { get; private set; }
public int Y { get; private set; }
public string Color
{
get { return _color; }
set
{
_color = value;
if (ColorChanged != null)
ColorChanged(this, EventArgs.Empty);
}
}
public event EventHandler ColorChanged;
}
窗口代码已相应更改
List<MatrixElement> _board;
public MainWindow()
{
InitializeComponent();
int rows = 10;
int columns = 10;
_board = new List<MatrixElement>();
for (int r = 0; r < rows; r++)
for (int c = 0; c < columns; c++)
_board.Add(new MatrixElement(r, c){Color = "Green"});
Board.ItemsSource = _board;
}
private void CellClick(object sender, MouseButtonEventArgs e)
{
var border = (Border)sender;
// each point has unique {X;Y} coordinates
var point = (MatrixElement)border.Tag;
// changing color in item view model
// view is notified by binding
point.Color = "#00BFFF";
}
稍微修改了ItemTemplate
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{Binding Path=Color}"
BorderBrush="Black"
BorderThickness="1"
MouseDown="CellClick"
Margin="2"
Tag="{Binding}">
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>