【问题标题】:How to draw a grid in WPF如何在 WPF 中绘制网格
【发布时间】:2010-02-23 12:39:38
【问题描述】:

我正在尝试在 WPF 中创建一个用户控件来表示 Go board,它本质上只是一个黑线网格,在某些交叉点上带有点。

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

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

【问题讨论】:

  • 您找到解决方案了吗?我也有同样的问题。
  • 我最近没有时间考虑这个问题,因为我一直忙于其他事情(但感谢那些回答的人),但是当我更新问题/接受答案时找到最佳解决方案。

标签: c# .net wpf drawing


【解决方案1】:

您可以通过多种方式解决此问题。

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


(来源:microsoft.com

您很可能不必使用 Grid。对于随机定位Canvas 更适合。如果你不喜欢画笔,可以使用GeometriesShapes 来绘制线条或其他图形。我没有将您推荐给DrawingVisuals,因为从一开始他们可能更难理解。

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

希望这会有所帮助,

干杯,安瓦卡。

【讨论】:

  • Анвака! :) Рад что ты тоже переехал с кывта в это чудное место。 И как раз твой ответ подходит для решения моей проблемы。
【解决方案2】:

前段时间我创建了棋盘,我创建了一个 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>

希望对你有帮助

【讨论】:

    【解决方案3】:

    可能有帮助的随机想法:

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

    不是很详细的方法——但这就是我解决问题的方式

    【讨论】:

      【解决方案4】:

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

      编辑: 将文件移至my Google drive

      我认为它会帮助你,this is 你会得到的结果。你也可以在那里下载项目。

      【讨论】:

      • 谢谢——这正是我所需要的!
      • 4 年过去了:未找到博客文章,未找到截屏视频。这就是为什么链接不应该是问题的答案。至少给出一些提示。
      • 我会在几个小时内解决这个问题。谢谢你告诉我。
      • 仍未找到博文。
      • @IAbstract 很抱歉耽搁了。项目到了,希望还不算晚drive.google.com/file/d/0B2TCEp0dTZ-odXAtUEh0Ry1WVEk/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 2021-11-08
      • 2012-07-22
      • 1970-01-01
      • 2011-08-05
      相关资源
      最近更新 更多