是否可以继承 XAML?

Edw*_*uay 3 c# wpf inheritance xaml

我有用户控件,它继承了一个如下所示的基类:

BasePage.cs:

using System.Windows.Controls;

namespace TestPageManager23434
{
    public class BasePage : UserControl
    {
        public string ButtonPreviousText { get; set; }
        public string ButtonNextText { get; set; }

        protected PageManager pageManager;

        public BasePage(PageManager pageManager)
        {
            this.pageManager = pageManager;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用户控件如下所示:

XAML:

<local:BasePage x:Class="TestPageManager23434.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="clr-namespace:TestPageManager23434"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Background="White" 
             Width="400"
             Height="400"                
                >
        <TextBlock Text="this is page1"/>
        <TextBlock Text="{Binding Message}"/>
        <Button Content="go to page 2" Click="Button_Click"
                HorizontalAlignment="Left"
                Width="200"
                Height="30"
                />
    </StackPanel>
</local:BasePage>
Run Code Online (Sandbox Code Playgroud)

背后的代码:

using System.Windows.Controls;

namespace TestPageManager23434
{
    public partial class Page1 : BasePage
    {
        public string Message { get; set; }

        public Page1(PageManager pageManager) : base(pageManager)
        {
            InitializeComponent();
            DataContext = this;
        }

        private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            pageManager.SwitchPage("page2");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是现在在我的各种 UserControls 的 XAML 部分中,我也有XAML 块,我也想从基类继承这些块,这样我就不会在每个 XAML 文件中复制这个块:

<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Left">
    <Button 
        Content="{Binding ButtonPreviousText}" 
        Width="150"
        Margin="5"
        Click="ButtonPrevious_Click"/>
    <Button 
        Content="{Binding ButtonNextText}" 
        Width="150"
        Click="ButtonNext_Click" Margin="5"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

但是由于我的基类没有 XAML,我看到了两种方法:

  • 在我的基类中的代码中创建它们
  • 为他们创建用户控件

或者是否有另一种方法可以在一个位置使用此 XAML 或以某种方式继承 XAML?

Dre*_*rsh 5

我建议阅读MSDN 上的 WPF控件创作概述。我不认为你将能够实现你想要用 UserControls 做的事情。UserControls 几乎意味着将一组特定的控件粘合在一起,以便在单个应用程序的范围内一致地重用它们。他们真的不应该被继承。

您可以做的一件事是以某种“MasterPage”方式使用它们(如果您熟悉 ASP.NET)。您可以将 ContentControl 放在“基本”用户控件中,并公开不同的属性,允许其他人将内容注入基本控件的标准布局中。通过这种方式,您的其他用户控件将“基本”用户控件作为其内部的根元素,并将各种内容属性设置为他们想要的任何元素。