WPF“十六进制网格”组件

时间:2009-06-18 01:47:14

标签: wpf custom-controls hexagonal-tiles

跳进WPF自定义控件的世界,并想知道设计HexGrid控件的最佳方法是什么?想想你最喜欢的桌面战争游戏;或者,同样可能的是,你最喜欢的视频游戏,从桌面战争游戏的骄傲历史中窃取了设计。

底层模型公开了一个重要的方法,作为Map类的一部分:

Hex GetHex(int x, int y, int z)*;

Hex包含所有相关数据(目前,地形枚举将1:1映射为背景颜色;从小处开始......)。

可能相关的约束:
地图的大小不会发生变化。十六进制数据在非常可预测的时间发生变化(始终直接响应用户操作)。

理想情况下,组件将展开以干净地填充其容器,并可直接在XAML中声明。

我正在寻找的是粗略概述我需要做些什么来构建它,而不是现成的组件。

*虽然我对这个寻址方案非常聪明,但显然我是late to the party

2 个答案:

答案 0 :(得分:3)

在我看来,在WPF中将HexGrid设计为Panel而不是UserControl更合理。面板没有视觉表现,只需要正确排列子元素(如果是HexGrid,则为蜂窝状图案)。那些儿童元素又应该具有六边形形状。

概念证明:我的HexGrid项目(太大而无法在此发布)

CodeProject article

GitHub repository

HexList :选择器ItemsControl,它在HexGrid面板上的HexItem容器中显示项目

HexGrid :以蜂窝状排列子元素的面板

HexItem :六边形的ContentControl

声明用法示例:

<hx:HexList Name="HexColors" Orientation="Vertical"
            Grid.Row="1"
            Padding="10"
            SelectedIndex="0"
            Background="{Binding Path=SelectedItem.Background, RelativeSource={RelativeSource Self}}"
            RowCount="5" ColumnCount="5">
    <hx:HexItem Grid.Row="0" Grid.Column="1" Background="#006699"/>
    <hx:HexItem Grid.Row="0" Grid.Column="2" Background="#0033CC"/>
    <hx:HexItem Grid.Row="0" Grid.Column="3" Background="#3333FF"/>
    <!--...-->
    <hx:HexItem Grid.Row="4" Grid.Column="1" Background="#CC9900"/>
    <hx:HexItem Grid.Row="4" Grid.Column="2" Background="#FF3300"/>
    <hx:HexItem Grid.Row="4" Grid.Column="3" Background="#CC0000"/>
</hx:HexList>

hex color selector

我明白这个问题是老人但是为了以防分享我的解决方案

答案 1 :(得分:1)

编辑:这是Pete项目页面的链接,该页面有一个十六进制网格样本。 http://blois.us/Projects.html 有一个路径查找示例,它显示了一个名为pathfinding的项目,该项目具有Hex Grid,并且可能使用与扫雷一样的基本代码。我还没有看过它。它是Silverlight 3,因此可能需要升级。扫雷是非常优雅的。

拉​​尔夫

ORIGINAL: 有一个六角形扫雷的peter blois的Silverlight 2样本。

它包含源代码。他有一个非常优雅的方法,通过覆盖网格上的measureoverride和arrangeoverride来做到这一点。鼠标悬停等工作正常。代码非常少。

我无法在网上找到该项目,虽然谷歌通过搜索六角形扫雷银光源代码blois有一个陈旧的链接

Peter Blois在以下地址有一个当前的博客,所以你可以尝试在这里联系他... http://blois.us/Projects.html

祝你好运并告诉我它是怎么回事,我将成为类似的东西。