将MainWindow.Background设置为外部资源

时间:2013-03-16 03:38:56

标签: wpf styles themes resourcedictionary skinning

我有一个包含主题'引擎'的.dll。我完成了这个引擎,内置的组合框可以通过.dll处理主题。简而言之,我想要完成的是一个独立的.dll,我可以从任何项目中引用,并且(不添加任何代码到托管应用程序)有我的主题,样式等...

到目前为止这有效但我遇到了一些困境。由于.dll使用URI语法在运行时加载必要的xaml文件,因此托管应用程序控件本身在加载应用程序之前不知道资源。现在,这会生成编译时警告,但在运行应用程序时没有问题。

我的问题与此编译时问题有关。如果我无法查看我的.dll中可用的画笔直到运行时,如何设置主窗口的背景颜色?

<Window x:Class="Check.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mycon="clr-namespace:ThemeLibrary.MyControls;assembly=ThemeLibrary"
    Title="MainWindow" Height="350" Width="525" WindowStyle="None" AllowsTransparency="True" 
Background="{***DynamicResource ResourceKey=TransparentColorBrush***}">

尽管存在错误,但程序编译并运行正常,因为如果动态资源无法解析,则窗口只是默认,但是一旦.dll加载包含刷子的资源字典,其键是TransparentColorBrush,那么窗口背景适当改变。但是,如果我把我的.dll交给公众玩,他们就不会知道不同的刷键是什么,因此无法做到这一点。

那么,如何在.dll中设置Application.Current.MainWindow.Background =(来自URI加载的资源字典的刷子,或字典本身),或者 将画笔的键公开为公共属性?

1 个答案:

答案 0 :(得分:1)

好的,这是我发现的......

在我的.dll中,我只需使用以下语法就​​可以为应用程序窗口设置以下属性......

Application.Current.MainWindow.SetResourceReference(Window.BackgroundProperty, "MainWindowBackgroundBrush");
        Application.Current.MainWindow.SetResourceReference(Window.BorderBrushProperty, "BorderBrush");
        Application.Current.MainWindow.SetResourceReference(Window.BorderThicknessProperty, "MainBorderThickness");
        Application.Current.MainWindow.SetResourceReference(Window.AllowsTransparencyProperty, "MainAllowsTransparency");

在我创建的静态类中,以帮助控制皮肤变化的相互作用。我还声明了一个新的资源字典如下:

xmlns:s="clr-namespace:System;assembly=mscorlib"
<Thickness x:Key="MainBorderThickness" >2</Thickness>
<s:Boolean x:Key="MainAllowsTransparency">True</s:Boolean>

我非常兴奋!这正是我一直在寻找的。所以现在我的自定义皮肤和将它们从一个更改为另一个的机制都被包装成一个.dll,它处理关于皮肤的一切,而不必向托管应用程序添加单个字符的代码。现在每个File&gt; New都可以简单地拥有一个程序集引用和xmlns命名空间,并且我的所有外观都可以使用POOF。