在多个级别的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,它仍然不工作。
有人知道如何修复它和在哪里?他们能在自己那边试用代码看看是否有效吗?
提前感谢您的帮助
技巧是依次将此字典放入合并字典中:
<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>