2

所以我对 WPF 很陌生,并认为作为一种学习经验,我会在 WPF 中实现一个简单的关卡编辑器。编辑器的目的是 2 倍。首先,我希望能够将任意方向的边界框定义为关卡中的“实心”区域。然后我希望能够放置、调整大小、倾斜图像。

多边形编辑器图像

我已经实现了使用画布绘制定向边界框的能力(见上图)。画布和工具栏位于停靠面板中。我现在正计划实现图像功能。我想做的是为每一层图像创建另一个 Canvas 层(可能很多)。这样做的原因是我可以轻松地限制每一层的选择和可见性。但是我不确定如何正确分层多个画布控件。当然,我目前使用的 DockPanel 容器不允许我在一个之上拥有多个控件。我想将我的 Canvas 图层嵌入到另一个画布中,但我不确定如何正确设置它(请注意,设置应该在代码中是动态的,因为我希望允许用户根据需要添加更多图层)。

理想的最终结果是具有透明背景的任意数量的层(因此我们可以看到后面的层)并且可以轻松隐藏。一次也只有一层接收用户输入。

所以我的问题是,他们是不是更合适的方法而不是分层画布?如果画布分层是一个好方法,有人可以提供如何设置的链接/示例代码。多个堆叠控件的最佳容器是什么(注意子画布大小应与父容器匹配)。

干杯!

4

1 回答 1

6

我可以建议替代方案吗?


XAML:

<ItemsControl ItemsSource="{Binding Path=MyObjectList}">
   <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
         <Canvas />
      </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
   <ItemsControl.ItemTemplate>
      <DataTemplate>
         <Rectangle Canvas.Left="{Binding Path=X}" Canvas.Top="{Binding Path=Y}"
                    Canvas.ZIndex="{Binding Path=Z}" ... />
      </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

C#:

public class MyObject
{
    public double X { get; set; }
    public double Y { get; set; }
    public int Z { get; set; }

    // Additional proeprties...
}

这可能是比将一堆帆布面板堆叠在一起更好的选择。


一个非常好的资源的摘录:

在开始之前,让我们回顾一下一些事情……在“C”代表 Collection 中,我们了解到 ItemsControl 以一种非常可预测的方式(即作为 CollectionView)呈现项目集合。然后在“D”中表示 DataTemplate,我们了解到集合中的项目可以是任何 CLR 对象,并且项目的可视表示是使用可视元素模板(称为 DataTemplate)定义的。

逻辑上出现的下一个问题是,“我们将这些视觉效果放在哪里?” 更具体地说,一旦项目的数据模板被膨胀,它的视觉应该放在哪里?为了回答这个问题,我们现在将研究如何为 ItemsControl 中的项目处理“布局”。

基本上:

  • ItemsControl - 项目集合
  • DataTemplate - 每个项目如何在视觉上表示
  • 面板 - 每个视觉表示的布局方式。
于 2013-09-27T02:09:44.647 回答