2014-09-24 73 views
1

是否有一種快速簡便的方法來實現類似MS Word中的顏色選擇器按鈕?WPF:簡單的類似MSWord的顏色選擇器按鈕

我希望用戶在下拉列表中選擇許多預定義的顏色。按鈕關閉時應顯示所選顏色。當用戶點擊按鈕時,應該觸發事件或命令。我想用一個按鈕實例在RichTextBox中設置文本顏色,另一個用於設置背景顏色(類似於MS Word)。

我的第一種方法是使用帶DataTemplate的組合框,其中包含一個按鈕。 這不起作用:當用戶點擊按鈕時,該按鈕的命令不會被觸發。相反,組合框的下拉菜單打開。我不知道確切的原因,但也許組合框默認模板中的IsHitTestVisible = false屬性?請參閱:http://msdn.microsoft.com/en-us/library/dd334408%28v=vs.95%29.aspx

<UserControl x:Class="MyBrushPicker" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d"    
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    Height="Auto" Width="Auto" MinWidth="50"> 
    <UserControl.Resources> 

     <!-- 
     Provide two different DataTemplates: 
     - SelectionBoxTemplate is used to display the selected color when the ComboBox is closed. 
      It contains a button which should be clickable (does not work). 
     - NormalItemTemplate is used to display a color in the opened ComboBox popup. 
     See: 
     http://stackoverflow.com/questions/2214696/wpf-how-to-customize-selectionboxitem-in-combobox 
     --> 

     <DataTemplate x:Key="NormalItemTemplate"> 
      <Border Height="44" Width="44" Margin="3,3,3,3" BorderThickness="1" BorderBrush="Black" Background="{Binding Mode=OneWay}"/> 
     </DataTemplate> 

     <DataTemplate x:Key="SelectionBoxTemplate"> 
      <!-- This button cannot be clicked: PreviewMouseDown and Button_Click events are never triggered. --> 
      <Button Click="Button_Click" PreviewMouseDown="Button_PreviewMouseDown"> 
       <Border Height="44" Width="44" Margin="3,3,3,3" BorderThickness="1" BorderBrush="Black" Background="{Binding Mode=OneWay}"/> 
      </Button> 
     </DataTemplate> 

     <DataTemplate x:Key="CombinedTemplate"> 

      <ContentPresenter x:Name="Presenter" 
        Content="{Binding}"         
        ContentTemplate="{StaticResource NormalItemTemplate}" /> 

      <DataTemplate.Triggers> 
       <DataTrigger 
        Binding="{Binding RelativeSource={RelativeSource FindAncestor,ComboBoxItem,1}}" 
        Value="{x:Null}"> 

        <Setter TargetName="Presenter" Property="ContentTemplate" 
         Value="{StaticResource SelectionBoxTemplate}" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </UserControl.Resources> 

    <ComboBox IsReadOnly="True" IsEditable="False" 
       ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=SelectableBrushes, Mode=OneWay}" 
       SelectedItem="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=SelectedBrush, Mode=TwoWay}" 
       ScrollViewer.VerticalScrollBarVisibility="Auto" 
       MinHeight="50" 
       MaxDropDownHeight="200" 
       ItemTemplate="{StaticResource CombinedTemplate}" 
       > 

     <ComboBox.Resources> 
      <Style TargetType="ComboBox"> 
       <Setter Property="ItemsPanel"> 
        <Setter.Value> 
         <ItemsPanelTemplate> 
          <WrapPanel IsItemsHost="True" Orientation="Horizontal" Width="200" /> 
         </ItemsPanelTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
      <Style TargetType="ComboBoxItem"> 
       <Setter Property="Width" Value="50" /> 
       <Setter Property="Height" Value="50" /> 
      </Style> 
     </ComboBox.Resources> 

    </ComboBox> 
</UserControl> 

有沒有辦法正確地使按鈕的工作? 有沒有更好的方法?

編輯:使用Snoop工具顯示ComboBox內未命名的ContentPresenter的IsHitTestVisible屬性實際上設置爲false(ValueSource:ParentTemplate)。如果我使用Snoop將此屬性設置爲true,則該按鈕變爲可點擊。

我可以從樣式中更改此屬性嗎? 至少,下面不工作:

<ComboBox.Resources> 
    <Style TargetType="ContentPresenter"> 
     <Setter Property="IsHitTestVisible" Value="True" /> 
    </Style> 
</ComboBox.Resources> 

回答

2

假設你不只是這樣做,作爲一個學習鍛鍊(使用庫毫無意義,這使得)...

在看看:Extended WPF Toolkit - Color Picker

我以前用它來簡單的即插即用的WPF顏色選擇器,它應該很好地解決您的問題。

+1

甚至有一個SplitItemsButton - 請參閱:https://dropdownbuttonlib.codeplex.com/ 但我必須避免第三方庫。 – devar 2014-09-24 22:39:38