代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

是否可以继承XAML?

  •  2
  • Edward Tanguay  · 技术社区  · 15 年前

    我有个UserControls,它继承了一个如下所示的基类:

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

    用户控件如下:

    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>
    

    代码落后:

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

    但是现在,在我的各种用户控件的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>
    

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

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

    或者在一个位置使用此XAML还有其他方法,或者继承XAML有其他方法吗?

    4 回复  |  直到 13 年前
        1
  •  4
  •   Erix    13 年前

    我建议你读一下WPF Control Authoring Overview 在MSDN上。我认为你不可能实现你试图用用户控件做的事情,尤其是。用户控件主要是将一组特定的控件粘合在一起,这样它们就可以在单个应用程序的范围内被一致地重用。他们真的不应该被继承。

    你能做的一件事就是以一种“母版页”的方式使用它们(如果你熟悉ASP.NET的话)。您可以将ContentControls放在“Base”用户控件中,并公开不同的属性,这些属性允许其他人将内容插入到基控件的标准布局中。通过这种方式,您的另一个用户控件将“基础”用户控件作为根元素放在自己的内部,并将各种内容属性设置为他们想要的任何元素。

        2
  •  1
  •   Steven    15 年前

    在您的示例中,最好创建一个名为“NavigationControl”的控件,然后在每个控件中使用该控件,而不是复制同一个块。如果没有更多的上下文和细节,很难给出一个好的解决方案。

        3
  •  0
  •   Jark    15 年前

    你可以写XAML然后使用 XamlReader 要将XAML解析为对象,它提供了编写XML而不是代码的优势。

        4
  •  0
  •   Akash Kava    15 年前

    如果每个控件都有这样的公共项,那么您可以对公共项进行用户控件,并在每个其他用户控件中使用它。

    其次,我可以看到您在公共项中有一些业务逻辑,但是编写业务逻辑的事件方式稍微旧一些,您应该考虑创建命令和实现命令。这将需要更多的研究,但它将让您轻松地设计更大的项目。