【问题标题】:Defining WPF Window style in class library在类库中定义 WPF 窗口样式
【发布时间】:2013-06-12 18:43:23
【问题描述】:

目前我正在开发一些 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 设计可能性。

【问题讨论】:

  • 就像注意你不能在一个窗口 AFAIK 中添加一个窗口

标签: wpf


【解决方案1】:

如果您只需要一次样式,解决方案非常简单:就地定义样式

<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>

【讨论】:

  • 我的工作版本使用带有资源字典的外部程序集,我得到同样的错误“找不到静态资源引用'MyWindowStyle'”。我只是简化了这个问题的代码,用单个文件生成相同的错误。我的主要问题是这个错误,因为如果 WPF 在同一窗口的 Window.Resources 中声明或引用为资源字典,则 WPF 无法找到我的样式。
  • 重点是在资源之后声明样式。我无法想象这会失败,除非样式根本不存在。无论如何,请接受一个答案(可能是您自己的)以将此问题标记为已解决。
【解决方案2】:

看起来我在这篇文章中找到了解决我的问题的方法: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 来让它工作。

感谢关注:)

【讨论】:

    【解决方案3】:

    只需添加外部程序集:

    <Application.Resources>
        <ResourceDictionary>
            Source="/MyAssemblyName;component/MyResources.xaml"
        </ResourceDictionary>
    </Application.Resources>
    

    【讨论】:

    • 我的工作版本使用外部程序集和资源字典,它没有解决问题,我只是简化了我的代码以显示错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多