1 回答
TA贡献1811条经验 获得超6个赞
网格是这里使用的错误面板。如果您正在设计驾驶舱,那么您已经知道元素的位置,因此您不需要 WPF 来为您进行布局。因此,使用 Canvas。您可能希望您的驾驶舱随视图缩放,因此根据您自己选择的任意单位(例如 1000x1000)为其指定一个大小,并将整个内容包装在一个 Viewbox 中。
关于元素的实际呈现,您在屏幕上呈现控件列表,每当您这样做时,您的第一直觉应该是使用 ItemsControl。因此,您将从驾驶舱元素的某种类型的基本视图模型开始,然后将它们全部放在一个列表中。要显示它们,您可以使用 ItemsControl,将 ItemsSource 绑定到您的列表。您希望在 Canvas 上显示所有控件,因此模板化 ItemControl 的 ItemsPanel。最后,您需要指定每个元素在屏幕上的位置,因此为您的基本视图模型类提供 X/Y 属性并绑定到 ItemControl 的 ItemContainerStyle 中的那些。把所有这些放在一起,你会得到这个:
<Viewbox>
<ItemsControl ItemsSource="{Binding MyCockpitViewModels}" Width="1000" Height="1000">
<!-- Replace panel with a canvas -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- Set position of each element in the canvas -->
<ItemsControl.ItemContainerStyle>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="Canvas.Left" Value="{Binding X}" />
<Setter Property="Canvas.Top" Value="{Binding Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</Viewbox>
如果你运行它,你会看到视图模型的名称显示在它们各自的画布位置,所以剩下要做的唯一一件事就是以某种方式告诉 WPF 要为每个元素而不是文本绘制哪些控件。这是通过 DataTemplates 完成的,您可以将其放置在可视树中的任何位置,例如 app.xaml 的 ResourceDictionary,或者用于 MainWindow 的那个,或者更好的是放在 ItemsControl 的资源块中:
<DataTemplate DataType="{vm:SwitchOffOn_ViewModel}">
<controls:SwitchOffOn_View />
</DataTemplate>
自从我使用 Micro 以来已经有一段时间了,它实际上可能会为您执行此 DataTemplating,但如果没有,请按照我在此处为您的每个控件显示的那样明确声明它,您将拥有一个完全呈现的驾驶舱。
- 1 回答
- 0 关注
- 71 浏览
添加回答
举报