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