You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP中如何在Application.Resources添加ResourceDictionary与自定义资源

正确在UWP的App.xaml中添加多种资源的方法

你遇到的问题核心是Application.Resources只能直接赋值一次,但可以通过ResourceDictionary的内部结构来容纳多种资源,同时解决运行时崩溃的问题,分两步处理:

一、修正App.xaml的资源结构

当Application.Resources已经包含ResourceDictionary时,所有自定义资源都要放在这个ResourceDictionary内部,不能和它同级。正确结构示例:

<Application
    x:Class="YourAppName.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:YourAppName">

    <Application.Resources>
        <!-- 唯一的ResourceDictionary根节点 -->
        <ResourceDictionary>
            <!-- 可选:添加系统/第三方合并字典 -->
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ms-appx:///Styles/DefaultStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>

            <!-- 直接添加你的自定义类资源 -->
            <local:MyClass x:Key="MyCustomResource"/>
            
            <!-- 其他资源(如样式、字符串)也可放在这里 -->
            <SolidColorBrush x:Key="PrimaryBrush" Color="#FF0078D7"/>
        </ResourceDictionary>
    </Application.Resources>
</Application>

二、解决运行时崩溃问题

把自定义资源放进ResourceDictionary后编译通过但运行崩溃,大概率是MyClass存在以下问题,逐个排查:

  • 缺少公开无参构造函数:UWP的XAML资源要求类必须有public无参构造函数,否则无法在XAML中实例化。检查你的类:
    public class MyClass
    {
        // 必须保留这个无参构造
        public MyClass()
        {
            // 注意:这里不要做访问UI元素、调用UI线程相关的操作
        }
    }
    
  • 构造函数中执行了UI相关操作:App初始化阶段UI框架还未完全就绪,如果MyClass的构造函数里尝试访问Window、Page或调用需要UI线程的API,会直接崩溃。把这类逻辑移到Loaded事件或其他合适时机执行。
  • 需要延迟加载:如果MyClass的实例化依赖UI环境,可以给资源加上x:DeferLoadStrategy="Lazy",让它在第一次被使用时才实例化:
    <local:MyClass x:Key="MyCustomResource" x:DeferLoadStrategy="Lazy"/>
    

额外技巧:拆分资源文件(可选)

如果资源太多,可以把自定义类资源单独放在一个XAML文件里,通过MergedDictionaries引入,保持App.xaml整洁:

  1. 新建ResourceDictionary文件(比如CustomResources.xaml):
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:YourAppName">

    <local:MyClass x:Key="MyCustomResource"/>
</ResourceDictionary>
  1. 在App.xaml中引入:
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ms-appx:///CustomResources.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

内容的提问来源于stack exchange,提问作者ricky rocky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:55:07