Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 避免可重用WPF控件中的XAML资源密钥冲突_C#_Wpf_Xaml_Conflict_Resourcedictionary - Fatal编程技术网

C# 避免可重用WPF控件中的XAML资源密钥冲突

C# 避免可重用WPF控件中的XAML资源密钥冲突,c#,wpf,xaml,conflict,resourcedictionary,C#,Wpf,Xaml,Conflict,Resourcedictionary,我正在开发一个WPF控件,但我无法控制将使用它的应用程序。某些XAML资源字典键对于我的控件来说显然是唯一的,例如,,因此没有冲突的风险 但是,我也需要使用非唯一对象,如BooleanToVisibilityConverter。如果我使用“BooleantVisibilityConverter”键添加它,则包含我的资源字典的控件使用者可能(很可能)已经在其代码中定义了类似的转换器,可能具有不同的行为 标准控制在某种程度上避免了冲突。Aero.NormalColor.xaml中有一个WPF应用程序

我正在开发一个WPF控件,但我无法控制将使用它的应用程序。某些XAML资源字典键对于我的控件来说显然是唯一的,例如,
,因此没有冲突的风险

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

标准控制在某种程度上避免了冲突。
Aero.NormalColor.xaml
中有一个WPF应用程序不可见的
。然而,我不知道如何做到这一点


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

通常,WPF控件的设计方式不要求客户明确包含任何资源字典。带有WPF控件的程序集具有
ThemeInfo
属性:

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None,
    ResourceDictionaryLocation.SourceAssembly
)]
它指定在何处查找默认样式,默认样式将写入
Themes/Generic.xaml
文件

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

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>

避免使用键的一种解决方案是,将
值转换器作为单例使用

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

希望这有帮助