wpf 外部(dll)资源字典中的窗口样式不适用于设计模式

zbdgwd5y  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(129)

我创建了一个外部控件库,它承载了一些资源字典等。我的问题是当我尝试在窗口元素上应用样式时。样式的更改仅在运行模式下可见!!!
我的控件库中的资源字典示例:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="Window_Style" TargetType="Window">
        <Setter Property="Background" Value="#FF272727"/>
    </Style>

</ResourceDictionary>

以下是我如何将外部资源字典包含到应用中的方法:

<Application x:Class="SigmaLibMaster.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:SigmaLibMaster"
             StartupUri="MainWindow.xaml">

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/SigmaLib;component/Resources/Styles/Window.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>

以及如何将其应用于窗口元素:

<Window x:Class="SigmaLibMaster.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:SigmaLibMaster"
        mc:Ignorable="d"
        Title="MainWindow" Height="480" Width="840"
        
        Style="{DynamicResource Window_Style}">

    <Grid >
        
    </Grid>
    
</Window>

你知道为什么会这样吗?

    • PS:**请记住,我最近从WinForms切换到WPF!!:)
7kqas0il

7kqas0il1#

有时您会发现库中的资源在设计时不起作用。
这是一个错误的海事组织。
我使用的工作循环是设计时资源。
这是一个最初为blend设计的机制,但是visual studio中的wpf设计器现在与blend是同一个设计器。
我有一个图书馆叫uilib。
在它的属性中,我添加了一个名为DesignTimeResources.xaml的资源字典,它必须是这个名称。
在csproj中,我有以下内容:

<ItemGroup>
<Page Include="Properties\DesignTimeResources.xaml" Condition="'$(DesignTime)'=='true' OR ('$(SolutionPath)'!='' AND Exists('$(SolutionPath)') AND '$(BuildingInsideVisualStudio)'!='true' AND '$(BuildingInsideExpressionBlend)'!='true')">
  <Generator>MSBuild:Compile</Generator>
  <SubType>Designer</SubType>
  <ContainsDesignTimeResources>true</ContainsDesignTimeResources>
</Page>

请特别注意ContainsDesignTimeResources标记。
它合并了我在uilib中的一些资源字典:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:UILib">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/UILib;component/Resources/Geometries.xaml"/>
        <ResourceDictionary Source="pack://application:,,,/UILib;component/Resources/ControlTemplates.xaml"/>
        <ResourceDictionary Source="pack://application:,,,/UILib;component/Resources/FontResources.xaml"/>
        <ResourceDictionary Source="pack://application:,,,/UILib;component/Resources/UILibResources.xaml"/>
        <ResourceDictionary Source="pack://application:,,,/UILib;component/Resources/HypsoColoursRD.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

当你构建的时候,它不会在额外的时间里合并这些资源。标签中的条件意味着它只是设计时间。你可能会通过搜索找到更多关于它的信息。
https://dennymichael.net/2016/07/28/wpf-design-time-resources-dictionary/

相关问题