我尝试在WPF中实现Whac a mole game。
Molehills在 UniformGrid 中。根据选项,molehills是复选框或图像。这就麻烦了。
我不知道如何实现 UniformGrid 接受复选框和图像。
也许你更了解我如何解决它。对于复选框和图像, UniformGrid 可能不是一个好主意。
我试过这种方式:
<ItemsControl Name="GameBlocksItemsControl" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=Moles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Path=Conf.Cols}"
Rows="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Path=Conf.Rows}"
Name="MolesGrid">
</UniformGrid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Moles 是对象的集合,以便我可以放置复选框或 BitmapImage 。
不幸的是,在向集合中添加了一些 BitmapImage 后,它们无法正确显示(而不是图像,而是写成: System.Windows.Media.Imaging.BitmapImage )。如果我将 CheckBox es添加到集合中,它们会很好地显示。
我考虑过编写转换器但是这样的转换器必须知道指定对象是 CheckBox 还是 BitmapImage 。即使可以编码,也不是很优雅的解决方案
答案 0 :(得分:0)
就我个人而言,我只需根据ItemTemplate
SelectedViewOption
例如,假设SelectedViewOption
是一个简单的字符串:
<Style x:Key="MyItemsControlStyle" TargetType="{x:Type ItemsControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedViewOption}" Value="Image">
<Setter Property="ItemTemplate" Value="{StaticResource ImageTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding SelectedViewOption}" Value="CheckBox">
<Setter Property="ItemTemplate" Value="{StaticResource CheckBoxTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
这样,您不仅可以在以后轻松添加其他视图选项,还可以删除DataContext
中任何特定于视图的代码,例如CheckBoxes
或{{1} }。通常,您希望将UI和业务逻辑层分开,这样就可以实现这一点。