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

标签 c# wpf xaml conflict resourcedictionary

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

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

标准控件以某种方式避免了冲突。有一个 <BooleanToVisibilityConverter x:Key="bool2VisibilityConverter" />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>

关于c# - 避免可重用 WPF 控件中的 XAML 资源键冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18947658/

相关文章:

java - C# 和 Java 类属性有什么区别?

c# - 处理问题

c# - 在应用 Mode-View-ViewModel 设计模式时包括部分 View

c# - 具有可变数量的 TextBlock(使用 ItemsControl 创建)的 WPF RichTextBox 失去选择行为

c# - 在 ItemsGrid View 中禁用鼠标滚轮滚动

c# - 确定用户是否属于本地管理员组

c# - 在 .NET 多语言 Web 应用程序中验证名称的正则表达式

c# - 如何在可视化树中查找元素? wp7

WPF停止可见性的 Storyboard 已更改

c# - 绑定(bind) DataGridComboBoxColumn