代码之家  ›  专栏  ›  技术社区  ›  Will Vousden

如何在WPF中绘制网格

  •  5
  • Will Vousden  · 技术社区  · 14 年前

    我试图在WPF中创建一个用户控件来表示 Go board 这基本上只是一些交叉点上带点的黑线网格。

    目前我正在使用网格控件来处理石头的放置,但困难之一是石头放置在网格线的交叉点上,而不是它们之间,所以如果我想画线,它们需要穿过网格单元的中心。

    我对wpf还是个新手,所以我不太确定应该如何处理这个问题;我应该在每次控件呈现时手动绘制线条吗(如果是,如何?)或者有更好的方法吗?

    4 回复  |  直到 9 年前
        1
  •  0
  •   Carlo    9 年前

    我刚在我的博客中添加了这篇文章:

    编辑: 已将文件移动到 my Google drive

    我想这对你有帮助, this is 你会得到的结果。你也可以在那里下载项目。

        2
  •  5
  •   IAbstract    10 年前

    你可以用多种方法来解决这个问题。

    例如。一种方法是使用 DrawingBrush 填充面板的背景。以下是一些绘图画笔示例:

    alt text http://i.msdn.microsoft.com/ms653167.wcpsdk_mmgraphics_drawingbrushexamples(en-us,VS.90).png

    很可能你不需要使用网格。用于随机定位 Canvas 穿西装更好。如果你不喜欢刷子,你可以用 Geometries Shapes 画线条或其它图形我不是指你 DrawingVisuals 因为从一开始他们可能会有点难以理解。

    更新的 :在codeproject上找到这篇文章: Draw a Boardgame in WPF . 也许你会发现它很有用。

    希望这有帮助,

    干杯,Anvaka。

        3
  •  2
  •   Arsen Mkrtchyan    14 年前

    不久前,我创建了checkmate板,我创建了一个itemscontrol,其中的每个元素也是itemscontrol,使用小矩形模板。这是我的密码

    <UserControl x:Class="Checker.Controls.Board"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:models="clr-namespace:Checker.Models"
        xmlns:usercontrols="clr-namespace:Checker.Controls"
        xmlns:converters="clr-namespace:Checker.Converters">
        <UserControl.Resources>
            <models:BoardModel x:Key="boardModel"/>
            <converters:BoolToBorderColorConverter x:Key="boolToBorderColorConverter"/>
            <DataTemplate DataType="{x:Type models:Figure}">
                <usercontrols:FigureControl/>
            </DataTemplate>
        </UserControl.Resources>
        <Border>
            <ItemsControl ItemsSource="{Binding Source={StaticResource boardModel}, Path=BoardItems}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <ItemsControl ItemsSource="{Binding}" MouseDown="ItemsControl_MouseDown">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <VirtualizingStackPanel Orientation="Horizontal"/>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Border Background="{Binding Path='IsFirstColor', Converter={StaticResource boolToBorderColorConverter}}" BorderBrush="Black" BorderThickness="1" Width="50" Height="50" MouseDown="ItemsControl_MouseDown">
                                        <ContentPresenter Content="{Binding FigureOnBoard}">
    
                                        </ContentPresenter>
                                    </Border>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Border>
    </UserControl>
    

    希望这有帮助

        4
  •  1
  •   Murph    14 年前

    可能有帮助的随机想法:

    1. 使用一个网格-在那里,它应该可以很好地定位物体。
    2. 网格“cell”内容基本上是一个三态的东西,网格线上没有任何内容,网格线上有一块白色的石头,网格线上有一块黑色的石头-这应该是一个可重用的WPF标记-可能是一个用户控件,也可能是其他的东西(我对WPF来说还是太陌生了)。我想把这个绑定到你的数据上。
    3. 您可以将行为附加到单元格内容上,用于单击单元格内容的时间和其他内容。

    不是很详细的怎么做-但这就是我解决问题的方法