好的,总结一下我在做什么,我是一个大学集团的一员,他想为微软Surface开发一个回合制,网格场,战斗游戏。我的问题不涉及基于触摸的控制的任何问题,所以不要担心。这个游戏将使用WPF和.NET 3.5 Framework为Surface开发。
游戏的战斗系统将非常类似于Fire Emblem,Final Fantasy Tactics和Disgaea 2等热门游戏的游戏方式,其中所有单位都将被放置在将代表其位置的网格场上,并且也将被使用单位运动和攻击范围。
现在,看到这个游戏将主要基于网格,我认为最好的方法是使用标准的System.Windows.Controls.Grid,并根据需要在XAML中定义尽可能多的行和列代码。
示例:
<Grid Background="{StaticResource WindowBackground}" x:Name="GridField" ShowGridLines="True" Width="1024" Height="768">
<Grid.RowDefinitions>
<RowDefinition Height="32"/>
<RowDefinition Height="32"/>
<RowDefinition Height="32"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="32"/>
<ColumnDefinition Width="32"/>
<ColumnDefinition Width="32"/>
</Grid.ColumnDefinitions>
此代码将创建并显示3x3网格,每个网格块的大小为32x32。
现在,假设有一个名为Unit的完全开发的类,它将保存表示Unit的所有信息,包括它的Name和代表该单元的Image。为了争论,假设单位的图像是正确的大小和格式,以便在分配给网格时正确显示。
对于我团队的当前计划,我们打算用C#代码表示当前在该字段中的所有单元。
示例:
public Unit[,] allUnits = new Unit[3,3];
其中[3,3]表示网格定义的列数和行数。
现在,通常要将单个项目分配给网格,您必须明确地定义项目位置,如下所示:
Grid.Row =“1”Grid.Column =“1”Source =“{Binding Unit.Picture}”
现在我知道这不是正确的语法,但我真的不关心这个方法,我的例子至少给出了如何处理它的想法。
所以这是我的问题:有没有办法直接将我的2维单位阵列数据绑定到我的定义网格而不定义每个元素位置?例如:如果有一种方法将网格本身表示为数组,例如GridField [1,2]将表示Grid.Row =“1”Grid.Column =“2”(&lt; -That可能是向后) ,那么我所要做的就是说GridField [1,2] = Unit [1,2]。图片或类似的内容。
我不确定是否有办法做到这一点,所以这就是为什么我要问最好的方法。
总结:我想知道如何将我的网格直接绑定到我的2维单元阵列,以便网格成为我阵列中单位的可见代表。我想知道如何做到这一点,而不必明确定义每个Grid Block的内容以指向正确的数组位置。我不希望每个单位都定义它的位置,因为这是2维数组的目的,但是如果它是不可避免的那么就是它。
我希望这个问题有一个可行的解决方案,因为如果没有,下一步将涉及我创建自己的网格,这将是一个痛苦。
我为任何拼写错误和问题的长度道歉,但我想让自己尽可能清楚。
感谢您的时间和建议, FrostFlame64
答案 0 :(得分:1)
您可以使用自定义附加属性来实现此目的。见here。而不是Canvas使用Grid并通过自定义逻辑填充其子项。
答案 1 :(得分:0)
我可能会将Grid转换为ViewModel for DataBinding中的集合。 Collection对象应包含Indexes的属性,您可以将Grid.Row和Grid.Column绑定到。