wpf 如何使程序在设计时选取在Application.Resources中定义的应用程序范围的资源?

pkbketx9  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(154)

在设计时不会选取应用程序范围内的资源。
我的App.xaml(重命名为“Program. xaml”)填充了对资源字典的引用-

<Application
    x:Class="OffendingProgram.Program"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:PersonAI"
    StartupUri="AIAdventure.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/Controls/OffendingDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

我已在“Controls”文件夹中定义了我的资源字典,其中包含以下内容-

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ControlTemplate
        x:Key="OffendingTemplate"
        TargetType="{x:Type RepeatButton}" />
    <Style
        x:Key="{x:Type RepeatButton}"
        TargetType="{x:Type RepeatButton}">
        <Setter Property="Template" Value="{StaticResource OffendingTemplate}" />
    </Style>
</ResourceDictionary>

我的主窗口设置如下-

<Window x:Class="OffendingProgram.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:OffendingProgram"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Background="Black">
    <RepeatButton />
</Window>

在设计时,我可以看到我的“RepeatButton”占据了整个窗口(我将窗口背景设置为黑色以确保这一点),但在运行时,该按钮消失了(正如预期的那样,因为它选择了一个隐式样式,将控件模板设置为空模板)。
这只是一个最小的、完整的和可验证的示例,旨在说明我的问题-在设计时没有应用资源。
我错过了什么使我的资源在设计时被拾取?

46qrfjad

46qrfjad1#

我找到了答案。虽然方法可能会根据一个人正在使用的视觉工作室的版本而有所不同。
1.编辑项目文件
1.对于VS 2022,添加以下内容-

<ItemGroup>
     <None Include="Properties\DesignTimeResources.xaml">
         <SubType>Designer</SubType>
         <Generator>MSBuild:Compile</Generator>
         <ContainsDesignTimeResources>true</ContainsDesignTimeResources>
     </None>
 </ItemGroup>

其中Include="..."DesignTimeResources.xaml文件的路径。
1.重新加载您的项目。
包含在其中定义的ResourceDictionary的MergedDictionaries属性中的任何资源字典都将在设计时被选取和使用。

相关问题