目前我正在开发一些WPF类库,它将有几个WPF Windows并尝试为这些Windows创建我自己的窗口ControlTemplate,以便为这些窗口设计更好的设计(受本文启发:Reusing Control Templates in Resource Dictionaries)。
问题是,那么它是一个WPF类库而不是一个应用程序集,我可以使用app.xaml来定义我的资源字典引用&等...
使用下面的代码我收到错误:找不到StaticResource引用'MyWindowStyle'
<Window x:Class="SomeERP.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
Style="{StaticResource MyWindowStyle}">
<Window.Resources>
<!-- My Window Style -->
<Style x:Key="MyWindowStyle" TargetType="Window">
<Setter Property="Background" Value="Transparent" />
<Setter Property="WindowStyle" Value="None" />
<Setter Property="AllowsTransparency" Value="True" />
<Setter Property="Opacity" Value="0.95" />
<Setter Property="Template" Value="{StaticResource MyWindowTemplate}" />
</Style>
<!-- Window Template -->
<ControlTemplate x:Key="MyWindowTemplate" TargetType="{x:Type Window}">
<Grid>
</Grid>
</ControlTemplate>
</Window.Resources>
</Window>
我怀疑我得到了这个错误,因为在我的情况下,它不是在Window声明之前预先声明的,就像app.xaml中的应用程序的情况一样,我没有在类库中。我是WPF的新手,刚开始使用WPF设计的可能性。
答案 0 :(得分:2)
如果您只需要一次样式,解决方案非常简单:只需就地定义样式
<Window.Style>
<!-- My Window Style -->
<Style TargetType="Window">
...
</Style>
</Window.Style>
但是,如果您需要多个窗口中的样式,则在资源字典中定义样式是合理的。然后,您可以将资源字典集成到窗口的资源中并相应地设置样式:
<Window.Resources>
<!-- My Window Style -->
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml"/>
<!-- path to the resource dictionary -->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resource>
<Window.Style>
<StaticResource ResourceKey="MyWindowStyle"/>
</Window.Style>
答案 1 :(得分:0)
看起来我在这篇文章中找到了解决我问题的方法:Assembly-wide / root-level styles in WPF class library并根据这篇文章What's the difference between StaticResource and DynamicResource in WPF?
StaticResource 将在加载XAML期间解析并分配给属性,这在实际运行应用程序之前发生。它只会被分配一次,并且忽略对资源字典的任何更改。
DynamicResource 在加载期间将一个Expression对象分配给属性,但在运行时要求Expression对象输入值时,实际上不会查找资源。这会延迟查找资源,直到在运行时需要它为止。一个很好的例子是对稍后在XAML中定义的资源的前向引用。另一个例子是直到运行时才会存在的资源。如果源资源字典已更改,它将更新目标。
这就是我需要的,因为我有类库,我没有app.xaml,也无法为 Window 预先声明资源。我只需要使用DynamicResource而不是StaticResource来使其正常工作。
感谢您的关注:)
答案 2 :(得分:-1)
只需添加外部装配:
<Application.Resources>
<ResourceDictionary>
Source="/MyAssemblyName;component/MyResources.xaml"
</ResourceDictionary>
</Application.Resources>