删除在运行时创建的资源的 XAML 设计器错误?

Posted

技术标签:

【中文标题】删除在运行时创建的资源的 XAML 设计器错误?【英文标题】:Remove XAML Designer error for resources created at runtime? 【发布时间】:2017-12-16 13:30:26 【问题描述】:

我的应用中有一些共享资源(假设它是一个简单的SolidColorBrush 对象),用于不同的控件和元素。

如果我的资源在共享资源字典中初始化,我可以在我的 XAML 代码中使用 StaticResource MyResourceName 引用它们,一切正常。

问题是我有一些资源依赖于一些运行时属性(例如设备类型),所以我在应用启动时用 C# 初始化它们。

当然,XAML 设计器找不到这些资源,因为它们尚未创建,会在这些行下划线并发出错误信号。

有没有办法隐藏这些 XAML 设计器错误,以防万一 引用我知道将在运行时可用的资源?


编辑:这是我如何在运行时加载资源的示例:

SolidColorBrush test = new SolidColorBrush  Color = Colors.Green ;
Application.Current.Resources["MyRuntimeResource"] = test;

【问题讨论】:

如何让资源在运行时可用? 你的样本不好,如果我是你,我更喜欢直接在后面的代码中设置Border.Background。为什么要使用资源? 您可以尝试使用设计时资源。但是您仍然需要创建它们,只是不必在应用运行时使用它们 @LeiYang "为什么要使用资源?" - 严重地?您真的认为在我使用该资源的每个控件中手动初始化该背景是更好的做法吗? 你听说过动态资源吗? 【参考方案1】:

尝试使用 ThemeResource <Border Background="ThemeResource MyRuntimeResource"/>

https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/xaml-theme-resources

在应用加载时评估 ThemeResource 标记扩展

【讨论】:

使用 ThemeResource 会给出相同的警告,因为在 XAML 设计器中甚至没有声明该资源,因此无法找到它。原因是资源(比如Brush)可以用不同的类来初始化(比如我可以同时使用自定义合成画笔和SolidColorBrush),所以我不能提前声明在 XAML 中,因为我不知道它在运行时实际上会有什么类型。 您还可以在 Application.Resources <SolidColorBrush x:Key="color" Color="Blue" /> 中为资源声明一个默认值,并在应用程序启动时更改它的值 Application.Current.Resources["color"] = new SolidColorBrush(Colors.Red); 这样设计者会找到 StaticResource 并且它的值会改变在运行时。 如果 StaticResource 可以更改,那么为什么 uwp 会像 OP 所说的那样忽略 DynamicResource? @LeiYang 可以像“您可以在运行时将其初始化为不同的值”一样更改 StaticResource,但这些更改不会反映在 UI 中。事实上,您必须在加载 UI 之前初始化这些资源。 是的,我知道,我只是想要一种隐藏警告的方法,而不必在启动时创建“假”不必要的资源。我的意思是,我不希望在运行时使用实际的 CPU 时间和内存来初始化这些默认资源,只是为了解决设计人员的问题。

以上是关于删除在运行时创建的资源的 XAML 设计器错误?的主要内容,如果未能解决你的问题,请参考以下文章

Telerik RadMenu XAML 设计器错误

如何在 UWP 类库中使用 XAML 静态资源和设计时数据

XAML 设计器错误 - 缺少智能感知

x:绑定设计时问题

是否可以将 Xaml 设计器或智能感知与 Xamarin.Forms 一起使用?

在 Visual Studio 2013 xaml 设计器和 Blend 中出现错误(异常 0x80073CF9)