在多个级别的wpf中查找资源

本文关键字:wpf 查找 资源 | 更新日期: 2023-09-27 18:02:47

当我在wpf中有几个级别或资源时,我有一个问题

例如

如果我有这样的代码

main.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    >
    <Style TargetType="{x:Type TextBox}" x:Key="Main">
        <Setter Property="FontSize" Value="50"/>
    </Style>
</ResourceDictionary>

sub.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    >
    <Style TargetType="{x:Type TextBox}" x:Key="Sub" BasedOn="{StaticResource     Main}">
        <Setter Property="BorderBrush" Value="Red"/>
        <Setter Property="BorderThickness" Value="20"/>
    </Style>
</ResourceDictionary>

all.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:p19"
    >
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Main.xaml"/>
        <ResourceDictionary Source="Sub.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

app.xaml

<Application.Resources>
    <ResourceDictionary Source="All.xaml"/>
</Application.Resources>

在主窗口中我只有

<Grid>
    <TextBox Style="{StaticResource Sub}"/>
</Grid>

这行不通。

但是,如果我像这样将资源直接放入app.xaml(而不是通过all.xaml)

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Main.xaml"/>
            <ResourceDictionary Source="Sub.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

确实有效。我想我记得有人在某处说过(我不记得在哪里了)这是wpf的一个bug,可以用一些空样式和新的。net框架来解决。

我尝试了2015 rc和4.6,它仍然不工作。

有人知道如何修复它和在哪里?他们能在自己那边试用代码看看是否有效吗?

提前感谢您的帮助

在多个级别的wpf中查找资源

技巧是依次将此字典放入合并字典中:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="All.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

应该没问题。

编辑

但是,当您试图从另一个字典访问样式时,您会遇到麻烦。为了在sub.xaml中删除这个引用:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    >
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Main.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    <Style TargetType="{x:Type TextBox}" x:Key="Sub" BasedOn="{StaticResource Main}">
        <Setter Property="BorderBrush" Value="Red"/>
        <Setter Property="BorderThickness" Value="20"/>
    </Style>
</ResourceDictionary>