WPF中的棋盘

时间:2009-12-27 16:01:52

标签: wpf chess

多年来我一直使用Winforms开发,现在我想切换到WPF并制作一个棋盘。不幸的是我不知道从哪里开始。使用WPF让我非常不确定,我再次感觉自己像个菜鸟。有人可以概述基本设计吗?我想我会从一个8x8网格开始,并使用矩形作为正方形,图像为碎片。然后?我错过了什么吗?

编辑:这只是关于用户界面;幕后发生的事情没有问题。

5 个答案:

答案 0 :(得分:9)

标准网格的替代方法是使用UniformGridmsdn link)。

它可能更适合这种情况(在我看来),因为它总能给你相同大小的细胞。

使用了ala:

<UniformgGrid Columns="8" Rows="8">
    <Control1/>
    <Control2/>
    <Control3/>
</UniformGrid>

这些答案中的任何一个都能为您提供所需的结果。

答案 1 :(得分:6)

Chess似乎非常适合WPF的MVVM代码模式。

模型将成为国际象棋游戏的逻辑,听起来就像你掌控着它一样。 View 将显示游戏的WPF外观, ViewModel 将显示游戏的表示形式,View可以在其中进行数据绑定。

对于视图,使用UniformGrid的ItemsControl将用于游戏的2D表示。

这是一个开始(未选中)

<ItemsControl ItemsSource="{Binding TheGame}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="8" Rows="8" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ContentControl Background="{Binding SquareColor}">
                <Path Data="{Binding PieceShape}" Fill="{Binding PieceColor}" />
            </ContentControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

要使上述工作正常,您的ViewModel需要ObservableCollection<ChessGridItem>,而ChessGridItem应该DependencyObject公开SquareColorPieceColorPieceShape的DependencyProperties {{1}}

答案 2 :(得分:1)

您可以在XAML或具有相同结果的代码中执行您的UI。我最近开始使用WPF,我推荐使用XAML方法。这开始有点令人生畏,但它很快变得熟悉起来。对我来说,感觉就像是一个精心设计的UI设计方法,现在WinForms看起来就像是对以前的任何东西打了一针.NET。

你可以从拖放方式开始,但如果你像我一样,你将很快在XAML中工作,并使用设计表面进行目视检查。

这可能不是我会怎么做但是如果你看过任何XML或HTML,你可能会猜到它会显示什么,即使你以前从未看过任何XAML:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="100" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
        <RowDefinition Height="100" />
    </Grid.RowDefinitions>

    <Border Grid.Column="0" Grid.Row="0" Background="Black" />
    <Border Grid.Column="2" Grid.Row="0" Background="Black" />
    <Border Grid.Column="1" Grid.Row="1" Background="Black" />
    <Border Grid.Column="3" Grid.Row="1" Background="Black" />
</Grid>

答案 3 :(得分:0)

不,我认为你根本没有遗漏任何东西。这是一个好的开始。

创建网格,然后添加列和行。然后将矩形放入交替的单元格(或图像)中。我会为矩形的填充颜色和笔触创建一个样式。这允许您在一个位置(样式定义)而不是您需要更改的每个单元格中更改背景颜色。

这是一个使用网格的非常基本的电路板。注意我没有硬编码行和列的大小。这将保持一切比例,并允许董事会扩大规模。

    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Name="A1"  />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Rectangle Name="rectangle1"
               Stroke="Black" Fill="Aquamarine" />
</Grid>

答案 4 :(得分:0)

我同意这里发布的所有样本,但我认为你有点困惑,因为WPF中的“数据”模板与WinForms的纯粹紧密绑定的UI +数据模型完全不同。

从WinForm到WPF是一个很小的学习曲线,我自己花了两年时间开始编写WPF代码,因为我总是在代码隐藏文件中更加自信。

我最好的猜测首先你需要研究WPF的“逻辑树”和“可视化树”概念,在这里您将了解WPF UI元素和非UI元素(数据对​​象)如何轻松地在XAML中连接而无需编写任何C#。

另一个最重要的概念,如“触发器”。

您需要创建的只是“数据”对象,它们将是您的国际象棋项目(King,Horse)等,派生自实现IPropertyChanged接口的一个公共基类,它们将实现“CanBeKilled”,“IsPossibleTarget”等属性简单地限制在ListBox的ItemTemplate中,ListBox将保存当前选择。

ListBox的项目面板模板可以是上述示例之一,在MouseOver上,您可以根据上述属性突出显示颜色或边框。您只需在选择更改时更新ListBox中每个项目的布尔属性。

我刚刚阅读了你的编辑部分,我相信在WPF中Code Behind必须是不同的和简单的,因为与WinForms相比,设计精美的WPF与WinForm相比将减少90%的代码。