避免可重用WPF控件中的XAML资源键冲突

时间:2013-09-22 19:02:02

标签: c# wpf xaml conflict resourcedictionary

我正在开发一个WPF控件,我无法控制将要使用它的应用程序。某些XAML资源字典键显然对我的控件是唯一的,例如<Style TargetType="{x:Type MyControl}">,因此不存在冲突风险。

但是,我也需要使用BooleanToVisibilityConverter之类的非唯一对象。如果我使用"BooleanToVisibilityConverter"键添加它,则可能(并且可能)包含我的资源字典的控件的使用者已经在他们的代码中定义了类似的转换器,可能具有不同的行为。

标准控制以某种方式避免冲突。 <BooleanToVisibilityConverter x:Key="bool2VisibilityConverter" />中有Aero.NormalColor.xaml,对于WPF应用程序不可见。但是,我不知道如何实现这一点。

如何避免资源名称冲突?如何让我的资源名称为“本地”以供我控制?

2 个答案:

答案 0 :(得分:3)

通常,WPF控件的设计方式不要求客户明确包含任何资源字典。使用WPF控件进行汇编具有ThemeInfo属性:

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None,
    ResourceDictionaryLocation.SourceAssembly
)]

指定查找默认样式的位置,并将默认样式写入Themes/Generic.xaml文件。

无论如何,由于资源字典键是object,您可以在某个内部静态类中定义绝对唯一的键:

internal static class ResourceKeys
{
    public static readonly object BooleanToVisibilityConverter = new object();
}

在XAML中使用它们而不是字符串:

<ResourceDictionary xmlns:local="clr-namespace:YOUR_NAMESPACE_HERE">
    <BooleanToVisibilityConverter x:Key="{x:Static local:ResourceKeys.BooleanToVisibilityConverter}" />
</ResourceDictionary>

答案 1 :(得分:1)

避免密钥的一个解决方案是,使用ValueConverter作为单身

public sealed class SingletonValueConverter : IValueConverter
{
    private static SingletonValueConverter instance;

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static SingletonValueConverter() {
    }

    private SingletonValueConverter() {
    }

    public static SingletonValueConverter Instance {
    get { return instance ?? (instance = new SingletonValueConverter()); }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        return ...
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        return ...
    }
}

现在您可以使用ValueConverter这样的

<TextBlock Text="{Binding TestProperty, Converter={x:Static local:SingletonValueConverter.Instance}}" />

希望这会有所帮助

相关问题