2016-11-09 200 views
0

在我的應用程序中,我有一大堆字典中定義的資源,它們都被合併到App.xaml中,並且一切正常。不過,我一直在嘗試添加第二個主題到我的應用程序。我有一個默認的點定義的所有的刷子,每主題定義顏色:動態顏色資源在WPF中行事奇怪

在共享Brushes.xaml:

<SolidColorBrush x:Key="ForegroundBrush" Color="{DynamicResource ForegroundColor}" /> 

然後,每個主題都有Colors.xaml字典,所有的色彩定義:

<Color x:Key="ForegroundColor">#FF112233</Color> 

一個基地字典ResourceLibrary.xaml合併所有的樣式,刷子等一起,然後獲取合併成的App.xaml,並Colors.xaml得到由主題管理合併到的App.xaml(Infragistics的,但我也嘗試手動合併它)。像這樣,什麼都沒有出現。但是,如果我將ResourceLibrary.xaml合併到我的視圖中,則所有內容都顯示在該視圖上。當我沒有合併它並且我看不到任何東西時,我仍然可以使用Live Visual Tree來查找控件,並且它們應用了所有正確的樣式和所有內容,包括正確的畫筆及其預期的資源鍵。 ..但是然後顏色總是#00FFFFFF(我認爲它是Color的默認值)。所以它能夠找到從App.xaml到顏色的所有內容,但似乎無法找到顏色。

這裏有另一個有趣的事情要注意...如果我將ResourceLibrary.xaml合併到我的窗口,然後在窗口上託管另一個用戶控件,用戶控件可以訪問所有顏色,除了正在使用的主窗口。如果畫筆沒有在窗口上使用,它將在用戶控件上正確顯示,如果它被窗口使用,則窗口將正確顯示,但在用戶控件中它具有#00FFFFFF顏色。

現在我已經三天抨擊我的頭並且已經多次走完整圈,現在我完全沒有想法。任何幫助將不勝感激。

+0

是其他主題也被「合併」與潛在的名字App.xaml中的資源字典碰撞?所有控件的樣式模板都綁定回「Foreground Brush」作爲模板級Foreground的靜態資源? –

+0

前一個主題的字典從App.xaml中取消並且新主題的字典被合併。這些樣式使用DynamicResource作爲畫筆,但這些樣式看起來工作正常,因爲當我使用Live Visual Tree時,它具有正確名稱的右側畫筆,但未設置畫筆的顏色。 – StuartMorgan

回答

0

進入相同/類似的問題並計算出來。對於任何有此問題的人,這裏是我所做的:

我必須將樣式中的筆刷引用設置爲StaticResources,並將筆刷中的顏色引用設置爲DynamicResources。現在,當我交換主題(用顏色分開資源字典)時,所有更新都正確。下面是一個例子:

隱式標籤樣式(注意ForegroundBrush被設置爲靜態資源):

<Style x:Key="LabelStyle" TargetType="{x:Type Label}"> 
    <Setter Property="Foreground" Value="{StaticResource ForegroundBrush}" /> 
</Style> 

刷子,其上述樣式引用:

<SolidColorBrush x:Key="ForegroundBrush" Color="{DynamicResource ForegroundColor}" /> 

這些顏色生活在單獨的「主題」資源字典在運行期間交換以更新主題。

輕主題(文本顏色)

<Color x:Key="ForegroundColor">Black</Color> 

黑暗主題(文本顏色)

<Color x:Key="ForegroundColor">White</Color>