2013-03-16 32 views
1

我有一個包含一個主題「引擎」一個.dll。我幾乎完成了這個引擎的內置組合框,通過.dll處理主題。總之我想要做到的是一個獨立的.dll文件,我可以在任何項目中引用和(無需添加任何代碼的託管應用程序)有我的主題,風格等..的MainWindow.Background設置外部資源

到目前爲止這有效,但我遇到了一點困境。由於該.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

這裏好就是我發現...

在我的.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> New都可以有一個程序集引用和xmlns命名空間,並且POOF中的所有皮膚都可用。