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