如何创建和使用(颜色)框C#WPF的矩阵

时间:2016-05-10 17:37:46

标签: c# wpf matrix colors

我必须使用WPF应用程序进行某种类型的游戏,其中包含一些颜色框矩阵(例如10x10)。点击一些它必须消除自己和周围的相同颜色的框,如果有超过3,并在消除后这些框授予一些随机颜色。

我在WPF应用程序中相当新,但我对C#编程有一些了解,我无法弄清楚应该从哪里开始。对我来说最困难的部分是"产卵"这个盒子就像一个矩阵一样使用它。

到目前为止,我发现了一些project,我认为它会对我有所帮助,但不是真的。

有人可以从我可以开始的地方导航,这是最相关的方式。

谢谢。

1 个答案:

答案 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>