【问题标题】:wpf create a style for a custom controlwpf 为自定义控件创建样式
【发布时间】:2015-08-10 14:25:32
【问题描述】:

我有一个继承自另一个(第三方)控件的自定义控件:

public class Int32EditBox : Xceed.Wpf.Toolkit.IntegerUpDown { }

然后,我尝试为这个控件创建一个样式:

xmlns:Controls="clr-namespace:MyApp.Controls;assembly=MyApp.Controls"
...     
<Style TargetType="{x:Type Controls:Int32EditBox}" BasedOn="{StaticResource {x:Type Controls:Int32EditBox}}">
            <Setter Property="ContextMenu" Value="{StaticResource DefaultDesignerContextMenu}" />
            <Setter Property="IsReadOnly" Value="True" />
          </Style>

问题是我收到一条错误消息,提示找不到资源“MyApp.Control.Int32EditBox”。

有人知道我为什么会收到这个错误吗?

【问题讨论】:

  • 您的目标类型似乎与您的 BasedOn 类型相同,这对我来说似乎不正确。该样式将继承任何先前定义的样式到该类型 - 无需基于任何我能告诉的内容。
  • 我试图省略“BasedOn”的东西,但看起来它是必需的。比那更多的。我有“默认” wpf 控件的其他样式,如下所示:&lt;Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}"&gt; &lt;Setter Property="ContextMenu" Value="{StaticResource DefaultDesignerContextMenu}" /&gt; &lt;Setter Property="IsReadOnly" Value="True" /&gt; &lt;/Style&gt; 并且它有效
  • 您是否覆盖了自定义控件中的 DefaultStyleKey?
  • 没有。我应该这样做吗?

标签: wpf custom-controls


【解决方案1】:

将此添加到自定义控件的静态构造函数中,否则它将使用 Xceed.Wpf.Toolkit.IntegerUpDown 的样式或任何设置了默认样式键的基类:

static Int32EditBox()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(Int32EditBox), new FrameworkPropertyMetadata(typeof(Int32EditBox)));
}

为了使 BasedOn 工作,在可视化树中必须有另一种带有该键的样式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多