【问题标题】:WPF : derived usercontrol from a control in a different project. How to make it use the same style?WPF:从不同项目中的控件派生的用户控件。如何使它使用相同的样式?
【发布时间】:2011-05-26 04:44:11
【问题描述】:

我正在使用“扩展 WPF 工具包”(http://wpftoolkit.codeplex.com/), 为了我自己的目的,我创建了一个名为 GNumericUpDown 的 NumericUpDown 控件的通用版本,它实际上让我可以指定要使用的类型,即。 GNumericUpDown。 (这样做是为了确保控件尊重所需类型的适当 Min/MaxValues)

为了能够使用来自 Xaml 的不同类型,我创建了一个具有特定派生版本的新项目,例如 f.e. NumericUpDownFloat 派生自 GNumericUpDown

但是当我在 XAML 中使用 NumericUpDownFloat 时,没有显示任何内容。 我认为这是因为在 WPF Toolkit 项目的 Generic.xaml 资源字典中只为 WPF Toolkit 的 NumericUpDown 指定了一种样式。

那么我怎样才能让我所有的特定版本(NumericUpDownInt、NumericUpDownByte、..)真正使用 那个 样式?

【问题讨论】:

    标签: wpf user-controls project styles inheritance


    【解决方案1】:

    您应该获得扩展 WPF 工具包的最新源代码。更新后的 NumericUpDown 控件允许您指定要在编辑器中使用的数据类型。以下代码指定使用 Int32 作为数据类型,而不是默认的 double。如您所见,这是通过在 NumericUpDown 控件上设置 ValueType 属性来完成的。

    <extToolkit:NumericUpDown Grid.Row="1" Value="{Binding Age}" Increment="1" Minimum="18" Maximum="65" ValueType="{x:Type sys:Int32}" />
    

    这将消除对具有特定衍生控件的单独项目的需求。

    【讨论】:

    • 很遗憾,此解决方案不再适用于扩展 WPF 工具包 (1.5.0) 的最新版本,因为 NumericUpDown 是一个模板。
    • 如果您阅读文档,就会发现 NumericUpDown 已过时,已被其他特定数据类型的上下控件替换。
    • 没错。如果该工具仍然存在,那就太好了,因为该工具包并不为每种数字类型(例如 UInt32)提供控件。
    【解决方案2】:

    默认情况下,当您制作任何类型的自定义控件时,WPF 会将其放入类的静态构造函数中:

    DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
    

    这告诉 WPF 您将以某种方式为其提供主题。默认情况下,将在项目的根目录创建一个 Themes 文件夹,其中包含一个使用 CustomControl1 样式和控件模板创建的 Generic.xaml 文件。

    如果你想告诉 WPF 你将被覆盖样式(或者实际上覆盖默认的样式键依赖属性),你只需将该行放在你的静态构造函数中。如果您希望它回退到它的父样式,您只需省略该行和类似这样的内容:

    public class SuperAwesomeControl : Border
    {
        ....
    }
    

    默认情况下总是看起来像边框。

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多