xaml - 如何从Silverlight中的XAML中定义的用户控件正确继承

标签 xaml inheritance user-controls silverlight-2.0

如果我已经编写了一个用户控件(在Silverlight中),并且使用XAML定义了它的外观,那么如何制作它的自定义版本?

即我有MyControl.xaml和MyControl.xaml.cs

如果我想要“ SpecialisedControl”子类,该怎么办?我假设我只是制作一个新的代码文件,然后从MyControl继承。但是,如果我想更改基类的外观,该怎么办?

最佳答案

我写这个想法是因为您是在谈论WPF,而不是Silverlight,但是可能有足够的重叠之处对此有所帮助,因此无论如何我都将其发布。

如果通过“更改基类的外观”表示“提供新模板”,则可能需要的是CustomControl,而不是UserControl。

最好的方法是遵循其他Microsoft控件(例如Button或ListBox)设置的示例:


创建一个直接从Control(或最接近您的控件)派生的类。
如果需要向控件公开任何属性(例如,按钮上的文本),请确保将其正确定义为DependencyProperties。
here所述,创建一个名为Themes / generic.xaml的ResourceDictionary,并为您的类添加一个包含模板的样式(不要为样式指定关键字)。
对于需要从控件中获取值的控件上元素的任何属性,请使用TemplateBindings。
如果您需要将任何事件处理程序附加到模板中的元素,请给它们指定一个唯一的名称。 Microsoft使用在这些名称前面加上“ PART_”的约定,出于一致性考虑,我认为这样做是一件好事,但这并不是严格要求的。
同样,如果您需要附加事件处理程序,请重载OnApplyTemplate()。在这种方法中,您应该分离所有旧的事件处理程序(我们当然不希望任何内存泄漏!),并查找具有您在模板中提供的名称的元素-找到它们时,请根据需要附加事件处理程序。


当然,这比简单地从UserControl派生要多得多,但是如果您希望能够像使用内置控件那样完全重新模板化控件,这就是做到这一点的方法。

另一方面,如果您要做的只是提供一定数量的有限自定义,例如更改背景或将Command与某些用户操作相关联,那么最好的办法是公开DependencyProperties,然后可以可以为您的控件设置样式,也可以为控件本身设置样式。

在您提到要自定义继承控件中的外观的情况下,该过程非常相似:只需为新控件添加具有新模板的默认样式即可;如果您需要添加更多事件处理程序,请绝对确定要调用base.OnApplyTemplate()。

关于xaml - 如何从Silverlight中的XAML中定义的用户控件正确继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/225878/

相关文章:

c# - 如何在代码隐藏中添加 <%= %> 标签

wpf - DataGridCheckBoxColumn IsReadOnly 属性绑定(bind)

c# - 页面加载时 MVVM 加载模型数据

javascript - 我想克隆一个 javascript 类。向克隆属性添加方法而不实际覆盖现有方法?

hibernate - JPA 如何与 EntityManager.find() 一起处理部分、非不相交的继承(在每表类场景中使用 InheritanceType.JOINED)?

c# - 如何访问 UserControl 上的控件?

c# - Caliburn Micro Conductor.Collection.AllActive 不工作

c# - 如何在 WPF 中围绕文本 block 的背景矩形定义描边?

php - 从基类调用继承类的父方法

wpf - 有人有一个带有单个 ContentPresenter 的 UserControl 的简单示例吗?