在自定义控件模板中找不到资源

时间:2012-10-15 13:35:01

标签: wpf xaml custom-controls

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:CuratioCMS.Client.UI.Controls">
<Style BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type local:ImageButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ImageButton}">
                <StackPanel Height="Auto" Orientation="Horizontal">
                    <Image Width="20"
                           Height="20"
                           Margin="10,4,0,4"
                           Source="{Binding Path=Image,
                                            RelativeSource={RelativeSource TemplatedParent}}"
                           Stretch="Fill" />
                    <TextBlock Margin="5,0,10,0"
                               HorizontalAlignment="Left"
                               VerticalAlignment="Center"
                               FontSize="12"
                               FontWeight="Bold"
                               Foreground="{TemplateBinding Foreground}"
                               Text="{TemplateBinding Label}" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这是用于ImageButton自定义控件的Generic.xaml中的代码。 whit工作正常,但我不能从Base按钮陈旧继承,所以不是从Button继承所有基本样式,而是只创建没有任何基本样式的自定义控件,并且

BasedOn="{StaticResource {x:Type Button}}"

在VS内部,显示错误,表示找不到资源'{x:Type System.Windows.Controls.Button}'

我不知道如何实现所需的样式以及为什么在Visual Studio编辑器中出现此错误消息

1 个答案:

答案 0 :(得分:0)

您正在基于通用按钮样式(在Generic.xaml中)定义样式,然后重新定义样式的模板。通过这种方式,基本样式将被覆盖。

如果你想改变一下风格,你有两个选择:

选项1:

  1. 提供通用按钮样式的键(使用TargetType="{x:Type Button}"查找Generic.xaml中定义的样式,并将x:Key="someName"添加到其属性中)
  2. 将每个其他按钮的样式(ImageButtons除外)设置为{StaticResource someName}
  3. 将ImageButton样式的BasedOn属性设置为{StaticResource someName}
  4. 选项2:

    1. 您可以制作通用按钮样式的副本
    2. 通过将TargetType设置为ImageButton而不是&#39;而不是&#39;为它设置任何键
    3. 更改所需的部分。
    4. 选项2通常是一个更好的解决方案,因为它不需要进行大量更改,但我已经完成了你想要做的事情,而且我没有找到任何方法来避免重复的样式代码