C# 为什么';t继承自DynamicSource工作(但composition继承)

C# 为什么';t继承自DynamicSource工作(但composition继承),c#,wpf,xaml,markup-extensions,C#,Wpf,Xaml,Markup Extensions,我正在实现自己的标记扩展,以确保颜色资源在VisualStudio的XAML设计器中正确显示。基本上,我有一个特殊版本的DynamicResource,它在运行时返回特定的资源 我的计划只是在设计模式下从特殊代码中派生并使用特殊代码,在正常模式下只调用基类 问题在于当我从DynamicResourceExtension继承时,似乎不会调用我被重写的ProviderValue方法 我强烈怀疑这是框架中的一个bug,但我想在这里发布,以防我遗漏了一些明显的东西 以下是同一扩展的两个版本,一个有效,

我正在实现自己的标记扩展,以确保颜色资源在VisualStudio的XAML设计器中正确显示。基本上,我有一个特殊版本的DynamicResource,它在运行时返回特定的资源

我的计划只是在设计模式下从特殊代码中派生并使用特殊代码,在正常模式下只调用基类

问题在于当我从DynamicResourceExtension继承时,似乎不会调用我被重写的ProviderValue方法

我强烈怀疑这是框架中的一个bug,但我想在这里发布,以防我遗漏了一些明显的东西


以下是同一扩展的两个版本,一个有效,另一个无效:

合成版本-此功能如预期运行

public class MyResourceComposition : MarkupExtension
{
    private readonly DynamicResourceExtension m_dynamicResource = new DynamicResourceExtension();

    public MyResourceComposition()
    {}

    public MyResourceComposition(string resourceKey)
    {
        ResourceKey = resourceKey;
    }

    public object ResourceKey
    {
        get { return m_dynamicResource.ResourceKey; }
        set { m_dynamicResource.ResourceKey = value; }
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (Helper.IsInDesignMode)
            return Brushes.Blue;

        return m_dynamicResource.ProvideValue(serviceProvider);
    }
}
继承版本-这不起作用

public class MyResourceInheritance : DynamicResourceExtension
{
    public MyResourceInheritance()
    {}

    public MyResourceInheritance(string resourceKey)
        :base(resourceKey)
    {
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (Helper.IsInDesignMode)
            return Brushes.Blue;

        return base.ProvideValue(serviceProvider);
    }
}    
这是我用来测试它的XAML:

<UserControl.Resources>
    <SolidColorBrush Color="Green" x:Key="MyBrush" />
</UserControl.Resources>

<StackPanel>
    <!-- This will be green at design time: OK! -->
    <Rectangle Fill="{DynamicResource ResourceKey=MyBrush}" Width="50" Height="50" Margin="8" />
    <!-- This will be green at design time: NOT OK! -->
    <Rectangle Fill="{local:MyResourceInheritance ResourceKey=MyBrush}" Width="50" Height="50" Margin="8" />
    <!-- This will be green at design time: OK! -->
    <Rectangle Fill="{local:MyResourceComposition ResourceKey=MyBrush}" Width="50" Height="50"  Margin="8" />
</StackPanel>

出于好奇,如果您将继承
矩形
放在构图
矩形
下面,会怎么样?这可能是
IsInDesignMode
属性的问题。也许不是第一次加载?不幸的是不是@MikeEason。MyRealScRead矩形是绿色的,不考虑位置。
internal static class Helper
{
    private static bool? s_isInDesignMode;

    public static bool IsInDesignMode
    {
        get
        {
            if (!s_isInDesignMode.HasValue)
            {
                var prop = DesignerProperties.IsInDesignModeProperty;
                s_isInDesignMode
                    = (bool)DependencyPropertyDescriptor
                                .FromProperty(prop, typeof(FrameworkElement))
                                .Metadata.DefaultValue;
            }

            return s_isInDesignMode.Value;
        }
    }
}