2010-06-29 41 views
4

我有一個定義我的DataGrid中如何看待一些共享的風格和我讓他們在Styles.xaml管理用戶可編輯的WPF風格

我添加了一個設置頁面,這將讓用戶更改一些顏色。在那個頁面上,我有一個示例網格(由於共享資源樣式,它自動看起來像其他網格)。在該頁面上,用戶可以使用顏色選擇器來修改屬性的顏色,例如行背景顏色,突出顯示的行顏色,標題背景以及使用數據驅動的轉換器應用的其他樣式。

我想要在設置頁面網格上應用的樣式僅用於預覽,並且如果應用,則返回到全局樣式。

我一直在爲每個可配置顏色加載一個顏色選擇器,並且不知道將結果應用於什麼。

應該我:

a。將所選顏色直接應用於網格? (似乎網格只允許我動態分配樣式,而不是個別樣式設置器)

b。獲取共享資源,複製它並在設置網格中交換它,比用戶「應用」將其交換爲共享資源? (這在我看來是理想的,但不知道該怎麼做。)

c。另一種做法呢?

回答

1

我會傾向於這樣處理:

  1. 使每個網格顏色單獨的資源,然後使用DynamicResource從網格樣式引用它們。
  2. 在一個單獨的「顏色」資源字典你Styles.xaml內把這些(下ResourceDictionary.MergedDictionaries)
  3. 定義具有顏色屬性,如果設置,更新畫筆的顏色在ResourceDictionary中
  4. 一個ColorProxy對象
  5. 在設置頁面的構造函數中,克隆「顏色」ResourceDictionary併爲每種顏色構造一個ColorProxy,然後綁定它們
  6. 在設置頁面的「保存」按鈕中,將「顏色」ResourceDictionary複製到您的用戶設置存儲並且也轉換爲主「顏色」ResourceDictionary

大部分都很簡單,所以我不會詳細討論。

這裏是Styles.xaml的想法:

<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary> 
     <SolidColorBrush x:Key="Row Background Color" Color="..." /> 
     ... 
    </ResourceDictionary> 
    </ResourceDictionary.MergedDictionaries> 

    <Style TargetType="DataGrid"> 
    ... 
    <Setter Property="Background" Value="{DynamicResource Row Background Color}" /> 
    ... 
    </Style> 
</ResourceDictionary> 

這裏的代碼複製結構的ColorProxy對象:

public IEnumerable<ColorProxy> ColorProxies 
{ 
    get 
    { 
    return 
     from key in _colorDict.Keys 
     select new ColorProxy { Dictionary=_colorDict, Key=key }; 
    } 
} 

和ColorProxy本身:

public class ColorProxy 
{ 
    public ResourceDictionary Dictionary { get; set; } 
    public object Key { get; set; } 
    public Color Value 
    { 
    get { return ((SolidColorBrush)Dictionary[Key]).Color; } 
    set { Dictionary[Key] = new SolidColorBrush { Color = value }; } 
    } 
} 

的現在可以使用以下編輯ResourceDictionary中的顏色:

<ItemsControl ItemsSource="{Binding ColorProxies}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate DataType="local:ColorProxy"> 
     <DockPanel> 
     <TextBlock Text="{Binding Key}" Width="200" /> 
     <ColorPicker Color="{Binding Color}" /> 
     </DockPanel> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

已編輯的ResourceDictionary可以轉換爲字符串存儲使用XamlWriter和使用XamlReader重新加載。

由Styles.xaml生成的主ResourceDictionary中的MergedDictionaries集合可以通過調用舊字典上的.Remove()和新字典上的.Add()來修改。

ResourceDictionaries可以通過簡單地構造一個新的ResourceDictionary來克隆,這個ResourceDictionary迭代舊字典中的條目並將它們添加到新字典中。

該技術不需要限於編輯顏色。可以創建任何類型的代理對象,包括通用綁定中的轉換器處理數據轉換的對象。