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 關注
- 97 瀏覽
添加回答
舉報