多年来我一直使用 Winforms 开发,现在我想切换到 WPF 并制作棋盘。不幸的是,我不知道从哪里开始。使用 WPF 让我非常不确定,我又觉得自己像个菜鸟。有人可以概述一个基本设计吗?我想我会从一个 8x8 网格开始,并使用矩形作为正方形,图像作为碎片。进而?我错过了什么吗?
编辑:这只是关于用户界面;幕后发生的事情没有问题。
标准网格的替代方法是使用UniformGrid
( msdn link )。
它可能更适合这个(在我看来),因为它总是会给你相同大小的单元格。
使用阿拉:
<UniformgGrid Columns="8" Rows="8">
<Control1/>
<Control2/>
<Control3/>
</UniformGrid>
这些答案中的任何一个都会给你你想要的结果。
国际象棋似乎很适合 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
DependencyPropertiesSquareColor
和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 编码,因为我总是更喜欢使用代码隐藏文件。
我最好的猜测是首先您必须研究 WPF 的“逻辑树”和“视觉树”概念,在那里您将了解 WPF UI 元素和非 UI 元素(数据对象)如何在 XAML 中轻松连接,而无需编写任何 C#。
还有另一个最重要的概念,例如“触发器”。
您需要创建的只是“数据”对象,它们将是您的国际象棋项目(King、Horse)等,从一个实现 IPropertyChanged 接口的通用基类派生而来,它们将实现诸如“CanBeKilled”、“IsPossibleTarget”之类的属性,这些属性可以简单地有界在 ListBox 的 ItemTemplate 中,您的 ListBox 将保存当前选择。
ListBox 的项目面板模板可以是上述示例之一,在 MouseOver 上,您可以根据上述属性突出显示颜色或边框。您所要做的就是在选择更改时更新 ListBox 中每个项目的布尔属性。
我刚刚阅读了您的编辑部分,我相信 WPF 中的代码背后一定是不同且简单的,因为与 WinForms 相比,设计精美的 WPF 与 WinForm 相比,背后的代码将减少 90%。