使用来自另一个程序集的WPF样式

时间:2015-08-24 19:20:08

标签: c# wpf xaml

我一直在谷歌搜索几个小时尝试不同的解决方案来解决我的问题但是却找不到那里或者在这里。

我有一个WPF自定义控件库,其中还包含一个主题.xaml文件,该文件包含我想要应用于控件的样式,但是在将其作为ResourceDictionary链接后,我无法在修改控件的style属性时访问该样式

这是我链接它的方式

<ResourceDictionary Source="pack://application:,,,/MADEV.WPFNotification;component/Themes/Dark.xaml"/>

这是.xaml文件内容:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:MADEV.WPFNotification">

<SolidColorBrush  x:Key="BG"
                  Color="#FF464646" />
<SolidColorBrush x:Key="BG_Darker"
                 Color="#FF3A3A3A" />
<SolidColorBrush x:Key="FG"
                 Color="#FFC5C5C5" />

<Style x:Key="NotificationStyle"
       TargetType="Window">
    <Setter Property="Height"
            Value="36" />
    <Setter Property="Width"
            Value="150" />
    <Setter Property="ResizeMode"
            Value="NoResize" />
    <Setter Property="ShowInTaskbar"
            Value="False" />
    <Setter Property="Topmost"
            Value="True" />
    <Setter Property="Focusable"
            Value="False" />
    <Setter Property="IsTabStop"
            Value="False" />
    <Setter Property="WindowStyle"
            Value="None" />
    <Setter Property="Foreground"
            Value="White" />
    <Setter Property="Background"
            Value="{StaticResource BG}" />
    <Setter Property="AllowsTransparency"
            Value="True" />
    <Setter Property="IsHitTestVisible"
            Value="False" />
    <Setter Property="ShowActivated"
            Value="False" />
</Style>

我很感激这方面的帮助

编辑1:当前App.xaml在vesan的回答之后,但仍然无效:

<Application x:Class="SimpleOSD.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:SimpleOSD"
         xmlns:properties="clr-namespace:SimpleOSD.Properties"
         StartupUri="BackgroundProcess.xaml">
<Application.Resources>
    <properties:Settings x:Key="Settings" />

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Pack://application:,,,/MADEV.WPFNotification;component/Themes/Dark.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

3 个答案:

答案 0 :(得分:5)

好的,我会发布最基本的实现,希望能为您指明正确的方向。

首先是控件库,项目WpfControlLibrary1,文件Dictionary1.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <SolidColorBrush x:Key="TestBrush" Color="LightBlue"></SolidColorBrush>
</ResourceDictionary>

现在WPF应用程序WpfApplication1(引用控件库),文件App.xaml:

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/Dictionary1.xaml"></ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

最后,Window1.xaml:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="400" Width="600" 
        Background="{StaticResource TestBrush}">
</Window>

在App.xaml中引用资源字典将使其可用于WPF应用程序中的所有窗口/控件。如果您不想这样,可以将代码从App.xaml移动到特定的XAML文件。

这是结果:

enter image description here

答案 1 :(得分:3)

您需要在<properties:Settings x:key=Settings> tag内移动<ResourceDictionary>。因此,Application.Resources需要一个ResourceDictionary实例。

答案 2 :(得分:0)

我知道这个问题已经问过很长时间了,但我最近需要找到这个问题并最终在这里结束。所以我认为我也应该分享我的解决方案。

假设你有两个组件(在同一个解决方案中)。

  1. MyProject1
  2. MyProject1.UI
  3. 第1步。 确保您正在引用MyProject1中的MyProject1.UI。

    MyProject1-&GT;参考文献 - &gt;添加参考... - &gt;项目 - &gt; MyProject1.UI

    第2步。 然后在MyProject1.UI中,您有一个名为“Styles”的文件夹,其中包含此Brush.xaml

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
        <SolidColorBrush x:Key="NormalBackgroundBrush" Color="SteelBlue"/>
        <SolidColorBrush x:Key="ErrorBackgroundBrush" Color="LightCoral"/>
    
    </ResourceDictionary>
    

    第3步。 然后,您可以在此处编辑MyProject1中的App.xaml:

    <Application x:Class="MyProject1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles/Brushes.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    

    对此:

    <Application x:Class="MyProject1.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/MyProject1.UI;component/Styles/Brushes.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>
    

    第4步。 现在您可以在MyProject1.UI中使用画笔作为 StaticResource ,如下所示:

    Background="{StaticResource NormalBackgroundBrush}"
    

    Background="{StaticResource ErrorBackgroundBrush}"
    

    希望它可以帮助某人:)