5

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

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

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

如何避免资源名称冲突?如何使我的资源名称为我的控件“本地”?

4

2 回答 2

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>
于 2013-09-22T19:25:37.300 回答
1

避免键的一种解决方案是,使用ValueConverteras 单例

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}}" />

希望这可以帮助

于 2013-09-22T19:32:31.900 回答