3

我正在构建一个 WPF 应用程序并将 caliburn.micro 用于 MVVM。我有几十个视图(用户控件)。

视图具有页眉正文和页脚。如下图所示,header 包含两个用于 crud 操作的按钮,footer 包含一个状态栏。

示例视图

所有视图的页眉和页脚部分都相同,但不同视图的正文内容会有所不同。目前,我正在为每个视图的标题和正文重复代码,现在我正在尝试消除重复代码。

为了实现这一点,我正在考虑制作一个通用的基本视图,以便与所有其他视图共享。

当前实施

<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>

试图实现类似的东西

基础视图

<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>

子视图

<Grid Name="Body"/> 

可能是我的方法是错误的(我对 WPF 有点陌生)。

我的目标是通过将一些控件继承到视图中来消除重复代码。

如何将基本视图与子视图结合起来?谁能建议我达到我的要求?提供一些代码示例将不胜感激。

4

2 回答 2

2

例如,您可以在父窗口或在父窗口的 XAML 标记中创建的两个单独的用户控件中定义公共页眉和页脚,然后使用 a 将子视图注入同一窗口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>

子视图对页眉和页脚一无所知。

于 2017-06-13T10:09:24.943 回答
0

你可以嵌套你UserControl的 s 就像你可以嵌套任何其他元素一样,所以你可以做这样的事情

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

然后你会DependencyProperty在你的标题控件中使用 a 来将你的子控件与它相关联,如下所示

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));

这篇文章提供了一个很好的概述——我知道它说的是 Silverlight,但它使用了相同的基本方法。

于 2017-06-13T07:19:39.153 回答