日期:2014-05-17  浏览次数:20740 次

WPF,自定义的控件,动态引用资源为什么不见效
一个自定义的控件CustomControl1:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WPF3">
    <Style x:Key="aa" TargetType="Border">
        <Setter Property="Background" Value="Red"/>
    </Style>
    <Style TargetType="{x:Type local:CustomControl1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                    <Border Style="{DynamicResource aa}" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>


public class CustomControl1 : Control
{
    static CustomControl1()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
    }
}


在CustomControl1的样式中,Border元素引用了一个Style资源"aa",引用方式为动态引用。但结果并不见效,改为静态引用(StaticResource)之后,才能见到效果。
请问,这是什么原因呢?难道动态引用还没有静态引用凑效吗?

------解决方案--------------------
没有这么用过,建议你google一下“依赖属性”

DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));不清楚你这句话是不是修改了默认的样式,或者需要处理相应的ProperyChange的相关内容
------解决方案--------------------
将模版与样式分开写!
------解决方案--------------------
引用:
Quote: 引用:

将模版与样式分开写!

与这一个控件相关的,我都是写在一堆的。东放点,西放点,更不好。
我就是不明白为什么,动态引用不行呢?静态引用为什么又可以呢?

请确认动态引用完成后,有没有相应的处理,即通知相关属性已经发生变化