2

目前我正在开发一些 WPF 类库,它将有几个 WPF 窗口,并尝试为这些窗口创建我自己的窗口 ControlTemplate 以更好地设计这些窗口(受这篇文章的启发:Reusing Control Templates in Resource Dictionaries)。

问题是,它是一个 WPF 类库而不是应用程序程序集,我可以在其中使用 app.xaml 并定义我的资源字典引用等...

使用下面的代码我得到一个错误:StaticResource reference 'MyWindowStyle' was not found

<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 设计可能性。

4

3 回答 3

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>
于 2013-06-12T19:05:23.320 回答
0

看起来我在这篇文章中找到了我的问题的解决方案:WPF 类库中的程序集范围/根级样式,并根据这篇文章WPF 中的 StaticResource 和 DynamicResource 有什么区别?

在应用程序实际运行之前加载 XAML 期间,将解析StaticResource并将其分配给属性。它只会被分配一次,并且对资源字典的任何更改都会被忽略。

DynamicResource在加载期间将一个Expression 对象分配给该属性,但直到运行时要求该 Expression 对象提供值时才实际查找该资源。这会延迟查找资源,直到在运行时需要它。一个很好的例子是对稍后在 XAML 中定义的资源的前向引用。另一个例子是直到运行时才存在的资源。如果源资源字典更改,它将更新目标。

这就是我所需要的,因为我有类库,我没有 app.xaml 并且不能为Window预先声明资源。我只需要使用 DynamicResource 而不是 StaticResource 来让它工作。

谢谢关注:)

于 2013-06-13T15:12:58.677 回答
-1

只需添加外部程序集:

<Application.Resources>
    <ResourceDictionary>
        Source="/MyAssemblyName;component/MyResources.xaml"
    </ResourceDictionary>
</Application.Resources>
于 2013-06-12T19:28:56.130 回答