XAML UserControlinheritance

来自Java,在构建GUI组件时,我真的习惯了一种常见的做法:我通常会做一些基类,它包含GUI组件的所有常用对象,然后我扩展它。

所以,基本上,这是我想用C#和XAML实现的。

为了使问题清楚,这是我正在做的一个例子(不起作用!):

我们有一个拥有自己的XAML的基类

     

然后我们有一个扩展第一个类的类

      

从2个XAML代码开始,我想要做的是将DerivedClass放入BaseClass容器中。 这将允许我在各种派生类之间共享组件,而无需每次我需要时编写代码。

例如,如果我希望我的所有组件都具有该圆形边框,我想将其放入低音类中,然后将其放在所有派生类中,而不必重写它。

当然,每个c#类都有自己的InitializeComponent()方法,这可能意味着派生组件将通过删除基类’one来构建自己的内容。

DerivedClass构造函数中删除方法甚至在派生类中也给出了基本内容,但是,当然,我丢失了在DerivedClass的XAML设计窗口中DerivedClass

DerivedClass调用基础构造函数没有任何影响,因为它在派生的InitializeComponent()之前调用。

所以问题是:如何在不破坏派生类的XAML设计的情况下,将基类的XAML设计用于派生类? 有没有办法简单地将内容添加到基类,同时仍然使用设计器本身?

(我知道我可以删除派生类的XAML并通过代码执行我想要做的事情,但我想知道我是否可以只使用设计器执行此操作,因为我不想在编写GUI时编写GUI设计师可用)

编辑:

在HighCore的回复之后,我做了一些适用于Windows Phone但我不确定我做的是正确的事情(是的,它有效,但可能是错的!)。

这是我做的:

BaseControl.xaml

   BASE    

BaseControl.xaml.cs

 namespace TestInheritance { public partial class BaseControl : UserControl { public Grid PresenterContent { get; set; } public BaseControl() { DataContext = this; InitializeComponent(); } } } 

DerivedControl.xaml

    DERIVED    

请注意, DerivedClassBaseClass一个实例,因为我需要它们出于其他原因而拥有一些常见的属性/方法。

您对我的解决方案有何看法? 是否有意义?

好吧,让我把它分成几部分:

来自Java

忘了java。 这是一种非常陈旧的语言,自90年代以来就没有发展过。 C#是一百万倍,WPF是迄今为止最好的UI框架。

从我所看到的,诸如swing之类的java UI框架在概念上类似于.Net的winforms,它也被WPF取代。

WPF(以及它基于XAML的兄弟)与其他任何框架都有着根本的不同,因为它们通过样式和模板进行自定义,并支持DataBinding 。

因此,在WPF上启动时需要重要的Mindshift


我通常做一些基类,它包含我的GUI组件的所有常见对象,然后我扩展它。

在WPF中,有内容模型 ,通过引入“任何内容”的function,消除了inheritance和其他膨胀的不必要实践的需要。

例如, Button可以这样定义:

  

结果

带红点的按钮

没有必要inheritanceButton只是为了定义它的内容。

WPF提供了一个额外的优点,并且非常方便, ContentProperty属性定义了XAML标记代表的内容。 Button来自ContentControl ,它的声明如下:

 //Declaration of the System.Windows.Control.ContentControl class, //inside the PresentationFramework.dll assembly //... [ContentProperty("Content")] public class ContentControl: Control //... { //... } 

这意味着以下XAML在function上与上述相同:

  
  • 请注意,我们删除了标记,因为ContentProperty属性负责处理。

所有这一切都归功于一个名为ControlTemplates的function,该function定义了Control的视觉外观,与其行为无关。


我想做的是将DerivedClass放入BaseClass容器中。

有几种方法可以实现这一点,其中之一是利用ControlTemplates并在XAML中定义将托管内容的特定容器:

            

然后你可以像这样重用这个模板:

        

这导致:

应用程序窗口

不需要inheritance或任何程序代码的东西。


在WPF中启动的另一个非常重要的方面,在上面的“重大Mindshift”链接中进行了广泛的解释,我在这里告诉大家:

在WPF中编写单行代码之前,先学习MVVM

  • 大多数情况下,您不会在WPF UI元素中放置任何代码 ,因为大多数事情都可以通过DataBinding实现(在上面的“DataBinding”链接中介绍),或者通过实现Reusable Attached Behaviors或Attached Properties 。 只有特定VIEW的代码才能放在代码后面, 而不涉及数据或业务逻辑

  • 您可能习惯在其他框架中使用的样板,例如:

     txtLastName.Text = person.LastName; txtFirstName.Text = person.FirstName; btnSubmit.IsEnabled = person.IsActive; 

    因为DataBinding,在WPF中完全不需要这样的东西。


另一个在UI中显示数据时具有高度灵活性的概念是WPF的DataTemplates ,它允许您定义在屏幕上“呈现”某些数据类型时要使用的特定UI。


由于上述所有原因,WPF与大多数UI框架根本不同,因此不需要在其他框架中常见的所有可怕的样板和黑客,

我建议您阅读所提供的所有链接,并在定义应用程序的结构和UI时记住所有这些概念和实践。

如果您需要进一步的帮助,请告诉我。

据我所知,除非资源XAML(样式为ex),否则按原样导出UI是不可用的。 也许原因是UI管理器无法猜测放置扩展XAML代码的位置:想象一下基本UI如下:

      

和派生的UI:

      

混合后会有什么结果?

一个直接的答案可能是:

          

这是不可能的。

那么控制嵌入/兼容性问题呢?