编辑:这只涉及用户界面;背后发生的事情不是问题。
除了标准网格外,还可以使用 UniformGrid
(msdn链接)。
在我的看法中,它可能更适合此问题,因为它始终会给出相同大小的单元格。
用法示例:
<UniformgGrid Columns="8" Rows="8">
<Control1/>
<Control2/>
<Control3/>
</UniformGrid>
任何一个答案都能给你想要的结果。
象棋似乎非常适合WPF的MVVM代码模式。
Model将是象棋游戏的逻辑,听起来你已经掌握了这一点。 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
,公开依赖属性SquareColor
、PieceColor
和PieceShape
你可以使用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>
不,我认为你没有错过任何东西。那是一个很好的开端。
创建一个网格,然后添加列和行。然后将矩形放入交替单元格中(或图像)。我会为矩形的填充颜色和描边创建样式。这样,您可以在一个位置(样式定义)更改背景颜色,而不是为每个需要更改的单元格更改。
这是一个使用网格的非常基本的棋盘。请注意,我没有硬编码行和列的大小。这将保持比例并允许棋盘缩放。
<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>
我同意这里发布的所有示例,但我认为你可能会因WPF中完全不同的“数据”“模板”模型与WinForms紧密绑定的UI +数据模型而感到有些困惑。
从WinForm转换到WPF需要一定的学习曲线,我自己花了两年时间才开始在WPF中编写代码,因为我总是更喜欢在codebehind文件中工作。
我最好的猜测是,首先您必须了解WPF的“逻辑树”和“可视树”概念,在那里您将了解WPF UI元素和非UI元素(数据对象)如何在XAML中轻松连接而无需编写任何C#。
还有另一个最重要的概念,即“触发器”。
您需要创建的所有内容都是“数据”对象,它们将是您的棋子项目(King,Horse)等,派生自实现IPropertyChanged接口的一个公共基类,并实现像“CanBeKilled”,“IsPossibleTarget”之类的属性,这些属性可以简单地绑定在ListBox的ItemTemplate中,其中您的ListBox将保存当前选择。
ListBox的项面板模板可以是上述示例之一,在MouseOver时,您可以根据上述属性突出显示颜色或边框。当选择更改时,您需要更新ListBox中每个项目的布尔属性。
我刚刚看了你的编辑部分,我相信WPF中的Code Behind必须与WinForms不同且更简单,因为与WinForms相比,设计良好的WPF将比WinForm少90%的Code Behind。