2015-04-28 38 views
0

我寫了一個WPF插件一些現成的,現成的產品,並在這個插件我用一個主題/樣式以更改所有按鈕的最小寬度像這樣:如何更改單個程序集的WPF控件的默認樣式?

<Style TargetType="Button"> 
    <Setter Property="MinWidth" Value="80" /> 
</Style> 

在他們從winforms遷移到WPF本身的最新版本的現成產品。現在,當我的插件加載時,以前隻影響我插入表單的樣式現在會影響應用程序中的全部按鈕。這使大多數UI不可用。

我知道我可以使用字典鍵爲基礎的資源,使這種風格特定於我的按鈕,但這意味着我必須手動更改我的插件中的每個按鈕,以及不要忘記設置每個樣式按鈕(以及此問題適用的其他元素)。還有其他選項可以使樣式特定於一組按鈕,如Is it possible to set a style in XAML that selectively affects controls?所示但我正在尋找一種方法讓我的樣式僅影響我的插件的樣式(因此比參考問題中討論的要粗糙一些)。這個插件由多個窗口/視圖組成(與Caliburn.Micro綁定在一起)。

有沒有一種方法可以輕鬆地將樣式範圍擴展到例如程序集或命名空間?我真的很想定義我的資源一次。目前它在Application.Resources級別定義,如果還有一個更適合我也想聽到。

+0

可能重複://計算器.com/questions/694798/is-it-it-it-set-a-style-in-xaml-that-selective-affect-controls) – Sinatr

+0

@Sinatr我已經更新了我的問題以突出它與爲什麼不同你引用了,謝謝你的鏈接,但以前沒有見過。 – dvdvorle

回答

-1

您需要爲您的樣式指定一個鍵並將樣式應用於所有按鈕。

<Style TargetType="Button" x:Key="MyButtonStyle"> 
    <Setter Property="MinWidth" Value="80" /> 
</Style> 


<Button Style="{StaticResource MyButtonStyle}"/> 

沒有鍵樣式用於應用程序中的所有按鈕(如您已經注意到的)。

+1

我自己發現了這一點,我在問題中談到了這種類型的解決方案,以及它如何不適合我的問題。有沒有一種方法可以用於使用Keys以外的其他樣式? – dvdvorle

0

使用ResourceDictionary,我們可以設置默認樣式,它將在Xaml中不使用定義樣式應用。

DictionayNew.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:Media="clr-namespace:System.Windows.Media;assembly=PresentationCore" 
       xmlns:System="clr-namespace:System;assembly=mscorlib"> 

    <!-- default button --> 
    <Style TargetType="{x:Type Button}"> 
     <Setter Property="FontWeight" Value="Normal" /> 
     <Setter Property="VerticalAlignment" Value="Center" /> 
     <Setter Property="MinWidth" Value="80" /> 
    </Style> 

    <!-- new button style --> 
    <Style x:Key="ActionButton" TargetType="{x:Type Button}"> 
     <Setter Property="FontWeight" Value="Normal" /> 
     <Setter Property="VerticalAlignment" Value="Center" /> 
     <Setter Property="MinWidth" Value="75" /> 
     <Setter Property="Height" Value="23" /> 
    </Style> 

    <!-- new button style based on previous style --> 
    <Style x:Key="BigActionButton" 
     BasedOn="{StaticResource ActionButton}" 
     TargetType="{x:Type Button}"> 
     <Setter Property="MinWidth" Value="150" /> 
     <Setter Property="Height" Value="30" /> 
    </Style> 
</ResourceDictionary> 

在XAML中,使用字典:

<Window x:Class="CheckDoublonImageBing.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="DictionaryNew.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 

    <Grid> 

    </Grid> 
</Window> 

然後,使用Button像往常一樣或與新的風格

<Button Content="Refresh" /> 
<Button Content="Delete selected" Style="{DynamicResource ActionButton}" /> 

隨着沒有定義樣式,按鈕將具有默認樣式def在字典裏。

編輯: 您可以設置合併後的字典由這樣的代碼:

ResourceDictionary myResourceDictionary = new ResourceDictionary(); 
myResourceDictionary.Source = new Uri("DictionayNew.xaml", UriKind.Relative); 
Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
的[是否有可能設定一個風格XAML是選擇性地影響控制?(HTTP
+0

我實際上並沒有定義自己的窗口,我使用Caliburn.Micro的IWindowManager來加載其中一個UserControls,因爲它是主要內容。我正在尋找一種方法來定義一次按鈕樣式。你的答案可以幫助我避免在每個按鈕上定義樣式,但我仍然需要在每個UserControl的ResourceDictionary中定義它。你知道一種將風格應用於整個程序集或命名空間的方法嗎? – dvdvorle

+0

@dvdvorle看我的編輯,我添加了一種方法來合併字典的代碼 – Xaruth