2017-06-13 105 views
2

我正在構建一個WPF應用程序,並使用caliburn.micro for MVVM。 我有幾十個視圖(UserControls)。WPF MVVM視圖/用戶控件繼承或類似的概念?

視圖有標題正文和頁腳。 如下圖所示,標題包含兩個用於粉碎操作的按鈕,頁腳包含一個狀態欄。

Sample View

頁眉和頁腳份將是相同的所有視圖,但身體的內容會有所不同對視圖中查看。 目前我正在爲每個視圖重複代碼的標題和正文,現在我試圖消除重複的代碼。

爲了達到此目的,我正在考慮制定一個共同的基本視圖,與所有其他視圖共享。

當前實現

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <Grid Name="Header/>" 
     <Grid Name="Body/>" 
     <Grid Name="Footer/>" 
    </StackPanel> 
</UserControl> 

試圖acheive像

基礎視角

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <Grid Name="Header/>" 
     <!-- {Placeholder for child view} --> 
     <Grid Name="Footer/>" 
    </StackPanel> 
</UserControl> 

ChildView

<Grid Name="Body"/> 

可能是我的方法是錯誤的(我對WPF有點新)。

我的目標是通過繼承視圖中的一些控件來消除重複代碼。

如何將基本視圖與子視圖組合? 任何人都可以建議我達到我的要求嗎? 提供一些代碼示例將不勝感激。

+0

在WPF中不可能繼承Views(UserControls),你的頁眉和頁腳在整個應用程序中是否保持不變? – XAMlMAX

+0

是的它沒有改變。只是我想以某種方式將頁眉和頁腳添加到我的子視圖中。 – Rahul

回答

0

可以通過嵌套的UserControl就像你一樣可以嵌套任何其他元素,所以你可以做這樣的事情

<UserControl x:Name="HeaderControl"> 
    <UserControl x:Name="ChildControl"/> 
</UserControl> 

然後你會使用一個DependencyProperty在你的頭控制你的孩子控制與之相關聯像這樣

public UserControl ChildControl 
{ 
    get { return (UserControl)GetValue(ChildControlProperty); } 
    set { SetValue(ChildControlProperty, value); } 
} 

public static readonly DependencyProperty ChildControlProperty = 
    DependencyProperty.Register("Text", typeof(UserControl), typeof(UserControl), new PropertyMetadata(null)); 

This文章給出了一個很好的概述 - 我知道它說的Silverlight,但它使用相同的基本方法。

1

例如,您可以在父窗口中或在您在父窗口的XAML標記中創建的兩個單獨的用戶控件中定義公用頁眉和頁腳,然後將子視圖注入到使用ContentControl,如:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="300" Width="300"> 
    <StackPanel> 

     <local:HeaderUserControl /> 
     <ContentControl Content="{Binding CurrentViewModel}"> 
      <ContentControl.Resources> 
       <DataTemplate DataType="{x:Type local:ViewModelA}"> 
        <local:ViewA /> 
       </DataTemplate> 
       <DataTemplate DataType="{x:Type local:ViewModelB}"> 
        <local:ViewB /> 
       </DataTemplate> 
      </ContentControl.Resources> 
     </ContentControl> 
     <local:FooterUserControl /> 

    </StackPanel> 
</Window> 

孩子的意見並不知道頁眉和頁腳什麼。