我有一個窗口包含一個Viewbox。在那個Viewbox中,我想有一個我已經創建的用戶控件的視圖。我正在使用MVVM(模型視圖視圖模型)設計模式。我在網上搜索了大約一個小時,我找不到任何示例或教程來解釋如何使用ContentPresenter
來顯示UserControl。如何將UserControl加載到(WPF)窗口內的ContentPresenter中?
回答
取決於。
我認爲你的主要問題是ContentPresenter
只在控制模板中使用。你不能把它粘在一個窗口中,並期望它顯示窗口的內容。我相信你真的需要做的是使用ContentControl託管你的用戶界面。
通過將模型綁定到此控件的Content
屬性,可以設置包含該模型的預期視圖的DataTemplates。我會給你一個簡短的例子。請注意,這可能與您的設計不符,但它展示了它們如何結合在一起。首先,對於每個視圖,創建一個管理該視圖的數據(和交互)的Model(或ViewModel)。
public sealed class Dialog : INotifyPropertyChanged // or DependencyObject
{
public string Input {get;set;} // INPC or DP implementation not shown
public ICommand Cancel {get;set;}
// class definition not shown
}
接下來,定義你的瀏覽在ContentPresenter顯示
<UserControl x:Class="Herp.DialogView"
HideImplementationDetails="true">
<Border BorderBrush="Red" BorderThickness="5">
<TextBlock Text="{Binding Input}" />
<Button Command="{Binding Cancel}">Cancel</Button>
<!-- etc etc -->
</Border>
</UserControl>
接下來,在你的窗口中添加ContentControl中和的DataTemplate
<Window HideImplementationDetailsForBrevityOfXaml="true">
<Window.Resources>
<DataTemplate xmlns:t="clr-namespace:Herp"
DataType="{x:Type t:Dialog}">
<t:DialogView />
</DataTempalte>
</Window.Resources>
<ContentControl Content="{Binding}" />
</Window>
最後設置的DataContext的窗口到您的Dialog
模型。
public MyWindow()
{
InitializeComponent();
DataContext = new Dialog();
}
這是怎樣的邏輯流程:創建
- 你的窗口。
- 對話框控件的一個實例在DataContext上設置。
- 在ContentControl中的綁定更新
- 默認的
ContentControl
搜索資源DataTemplateSelector的DataTemplate
其DataType
設置爲typeof(Dialog)
- 它發現窗口的資源在這個DataTemplate中
- 的DataTemplate中的內容是loaded並添加爲的
ContentControl
視覺孩子在任何時間的0 更改,重複相同的過程。因此,您可以擁有許多不同的模型,每個模型都包含一個不同的包含不同UserControl的DataTemplate,並且每次更新ContentControl上的綁定時都會看到期望的View。使用MVVM,您可以將ViewModel的屬性綁定到Content
屬性(稱爲Current或某物),然後根據ViewModel的當前狀態將屬性中的模型切換爲期望值。請注意,在ContentControl中,設置爲Content
屬性的任何內容都將成爲ContentControl的直接子節點的DataContext
。類似於ItemsControl
中的每個ItemsSource
是ItemTemplate
中定義的可視樹的DataContext
。
我隱藏了很多關於OK和Cancel的view-viewmodel交互方面的細節,但只要你有一個DataTemplate設置,那麼這應該使你的視圖在窗口內呈現。
我在我的應用程序的資源字典中定義我的視圖模型視圖的DataTemplates:
<DataTemplate DataType="{x:Type SaveDocumentChangesVM}">
<SaveDocumentChangesView />
</DataTemplate>
窗口以主視圖:
<Window x:Class="CustomDialogWindow"
SizeToContent="WidthAndHeight" ShowInTaskbar="False">
<ContentPresenter Name="DialogContentPresenter" />
</Window>
的構造函數窗口:
public CustomDialogWindow(object viewModel, string dialogTitle)
{
InitializeComponent();
// A datatemplate will allow WPF to figure out how to render the window contents
DialogContentPresenter.Content = viewModel;
if (dialogTitle != null)
{
Title = dialogTitle;
}
}
顯示如下對話框:
var vm = new SaveDocumentChangesVM();
var dialog = new CustomDialogWindow(vm, "This is my dialog");
dialog.ShowDialog();
- 1. WPF窗口不ContentPresenter
- 2. 如何將窗口添加到wpf中的usercontrol?
- 3. 如何將窗口邊框添加到WPF usercontrol?
- 4. WPF - window.ShowDialog窗口內。加載
- 5. 如何將WPF窗口作爲TabControl項目加載到MainWindow中?
- 6. 如何將WPF UserControl從一個窗口移動到另一個窗口?
- 7. 如何將一個WPF usercontrol內WInforms usercontrol?
- 8. 在子窗口中加載UserControl
- 9. 如何加載更快的WPF窗口?
- 10. WPF窗口託管usercontrol
- 11. 如何在BlendDesigner中將UserControl添加到窗口?
- 12. WPF usercontrol命令綁定到窗口viewmodel
- 13. 在UserControl中綁定contentPresenter的內容?
- 14. 如何從UserControl的自定義WPF窗口到父窗口的結果
- 15. 將WPF UserControl添加到TaskPane
- 16. 如何將子窗口僅在WPF的父窗口內移動?
- 17. IronPython WPF加載新窗口
- 18. WPF窗口預加載
- 19. WPF:從XAML加載窗口
- 20. 窗口加載和WPF
- 21. WPF,在UserControl內更新主窗口中的狀態欄
- 22. 如何將氣球指針添加到WPF中的窗口?
- 23. 如何在UserControl中使用ContentPresenter
- 24. 如何根據UserControl更改WPF中的高度窗口?
- 25. 將usercontrol的datacontext綁定到主窗口
- 26. 如何將加載窗口添加到sencha加載中的圖表中
- 27. 如何在代碼中將形狀添加到WPF窗口?
- 28. 在WPF/C中的UserControl的父窗口中添加子項到StackPanel#
- 29. 將WPF窗口附加到另一個進程的窗口
- 30. 如何在WPF中爲功能區窗口設置usercontrol?