Настройте свойство OnMouseOver по умолчанию для ComboBox в WPF - PullRequest
2 голосов
/ 23 августа 2011

Я хотел бы настроить значение по умолчанию - "OnMouseOver" - "цвет" для комбинированного списка, а также цвет "Фон" для списка, который опускается вниз в комбинированном списке. Можем ли мы настроить вышеУпомянутые свойства выпадающего списка. Если да, пожалуйста, помогите мне. Вот мой код Xaml для выпадающего списка:

<ComboBox Name="CmbBox1" BorderBrush="Black" Margin="1,1,1,1"
                      ItemsSource="{Binding}">
                <ComboBox.Style>
                    <Style TargetType="{x:Type ComboBox}">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="Red"/>
                        </Trigger>
                        </Style.Triggers>
                    </Style>
                </ComboBox.Style>
                    <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Background="{Binding Background}" Foreground="Black" FontSize="10"  TextAlignment="Left" 
                                               FontWeight="Black" Text="{Binding}"></TextBlock>

                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

1 Ответ

2 голосов
/ 23 августа 2011

Вот один из способов сделать то, что я думаю, что вы после. Я внес несколько изменений в ваш ComboBox.

Добавлены комментарии в код Xaml, поэтому он должен быть понятен

Редактировать. Это не работало в Windows 7 из-за ButtonChrome, который находится глубоко внутри ComboBox Template. Вы можете либо перепрограммировать все это, либо использовать этот обходной путь, который использует некоторый код позади.

Сначала добавьте ссылку на PresentationFramework.Aero
Затем подпишитесь на Loaded событие ComboBox, отключите ButtonChrome и привяжите фон MainGrid в обработчике событий, как это

private void CmbBox1_Loaded(object sender, RoutedEventArgs e)
{
    ComboBox comboBox = sender as ComboBox;
    ToggleButton toggleButton = GetVisualChild<ToggleButton>(comboBox);
    ButtonChrome chrome = toggleButton.Template.FindName("Chrome", toggleButton) as ButtonChrome;
    chrome.RenderMouseOver = false;
    chrome.RenderPressed = false;
    chrome.RenderDefaulted = false;
    chrome.Background = Brushes.Transparent;
    Grid MainGrid = comboBox.Template.FindName("MainGrid", comboBox) as Grid;
    Binding backgroundBinding = new Binding("Background");
    backgroundBinding.Source = comboBox;
    MainGrid.SetBinding(Grid.BackgroundProperty, backgroundBinding);
}

private static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
    T child = default(T);
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
        {
            child = GetVisualChild<T>(v);
        }
        if (child != null)
        {
            break;
        }
    }
    return child;
}

Xaml

<ComboBox Name="CmbBox1" BorderBrush="Black" Margin="1,1,1,1"
          ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}"
          Loaded="CmbBox1_Loaded"
          Width="150">
    <ComboBox.Resources>
        <SolidColorBrush x:Key="MouseOverBrush"
                         Color="Red"/>
        <SolidColorBrush x:Key="DropDownListBrush"
                         Color="Green"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                         Color="Transparent"/>
    </ComboBox.Resources>
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ComboBox}},
                                                Path=IsDropDownOpen}"
                             Value="True">
                    <Setter Property="Background" Value="{StaticResource DropDownListBrush}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
    <ComboBox.Style>
        <Style TargetType="{x:Type ComboBox}">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="{StaticResource MouseOverBrush}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Border x:Name="border" SnapsToDevicePixels="True">
                <TextBlock Foreground="Black" FontSize="10"  TextAlignment="Left" 
                           FontWeight="Black" Text="{Binding}"></TextBlock>
            </Border>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ComboBoxItem}}, Path=IsMouseOver}" Value="True">
                    <Setter TargetName="border" Property="Background" Value="{StaticResource MouseOverBrush}"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
...