WPF ComboBoxItem IsPressed Фон - PullRequest
       1

WPF ComboBoxItem IsPressed Фон

0 голосов
/ 20 февраля 2020

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

Я хочу иметь три разных цвета состояния для комбинированного элемента.

  1. normal Item - Background is White
  2. MouseHover или выбор клавиатуры - фон темно-синий
  3. Is Pressed - фон светло-синий (вы можете видеть этот цвет только при нажатии левой кнопки кнопка мыши, после отпускания кнопки мыши, всплывающее окно закроется)

Пользователь должен увидеть цветную обратную связь, когда он нажимает комбобокс

Ограничение : Я бы предпочел не использовать пользовательский класс со списком, который поддерживает событие isPressed, поскольку я хочу максимально повысить удобство использования.

Мой текущий стиль XAML

Шаблоны

<ControlTemplate x:Key="ComboBoxToggleButton.Template" TargetType="{x:Type ToggleButton}">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition Width="20" />
    </Grid.ColumnDefinitions>
    <Border x:Name="Border"
            Grid.ColumnSpan="2"
            CornerRadius="2"
            BorderThickness="1"
            BorderBrush="{TemplateBinding BorderBrush}"
            Background="{TemplateBinding Background}"/>
    <Border Grid.Column="0"
            CornerRadius="2,0,0,2"
            Margin="1" 
            Background="{TemplateBinding Background}" />
    <Path x:Name="Arrow"
          Grid.Column="1"
          HorizontalAlignment="Center"
          VerticalAlignment="Center"
          Data="M 0 0 L 4 4 L 8 0 Z" 
          Fill="{TemplateBinding Foreground}"/>
  </Grid>
</ControlTemplate>

<ControlTemplate x:Key="ComboBoxTextBox.Template" TargetType="{x:Type TextBox}">
  <Border x:Name="PART_ContentHost"
          Focusable="False"
          Background="{TemplateBinding Background}" />
</ControlTemplate>

<ControlTemplate x:Key="ComboBox.Template" TargetType="{x:Type ComboBox}">
  <Grid>
    <ToggleButton x:Name="ToggleButton"
                  Template="{StaticResource ComboBoxToggleButton.Template}"
                  Grid.Column="2"
                  Focusable="false"
                  ClickMode="Press"
                  IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                  Background="{TemplateBinding Background}"
                  Foreground="{TemplateBinding Foreground}" />
    <ContentPresenter x:Name="ContentSite"
                      IsHitTestVisible="False"
                      Content="{TemplateBinding SelectionBoxItem}"
                      ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                      ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                      Margin="3,3,23,3"
                      VerticalAlignment="Stretch"
                      HorizontalAlignment="Left" />
    <TextBox x:Name="PART_EditableTextBox"
             Style="{x:Null}"
             Template="{StaticResource ComboBoxTextBox.Template}"
             HorizontalAlignment="Left"
             VerticalAlignment="Bottom"
             Margin="3,3,23,3"
             Focusable="True"
             Background="Transparent"
             Visibility="Hidden"
             IsReadOnly="{TemplateBinding IsReadOnly}" 
             Foreground="{TemplateBinding Foreground}" />
    <Popup x:Name="Popup"
           Placement="Bottom"
           IsOpen="{TemplateBinding IsDropDownOpen}"
           AllowsTransparency="True"
           Focusable="False"
           PopupAnimation="Slide">
      <Grid x:Name="DropDown"
            SnapsToDevicePixels="True"
            MinWidth="{TemplateBinding ActualWidth}"
            MaxHeight="{TemplateBinding MaxDropDownHeight}">
        <Border x:Name="DropDownBorder"
                BorderThickness="1"
                BorderBrush="{TemplateBinding BorderBrush}"
                Background="{TemplateBinding Background}" />
         <ScrollViewer Margin="4,6,4,6"
                       SnapsToDevicePixels="True">
           <StackPanel IsItemsHost="True"
                       KeyboardNavigation.DirectionalNavigation="Contained" />
          </ScrollViewer>
      </Grid>
    </Popup>
  </Grid>
  <ControlTemplate.Triggers>
    <Trigger Property="HasItems" Value="false">
      <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" />
        </Trigger>
        <Trigger Property="IsGrouping" Value="true">
          <Setter Property="ScrollViewer.CanContentScroll" Value="false" />
        </Trigger>
        <Trigger SourceName="Popup" Property="AllowsTransparency" Value="true">
          <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4" />
          <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0" />
        </Trigger>
      </ControlTemplate.Triggers>
</ControlTemplate>

<ControlTemplate x:Key="ComboBoxItem.Template" TargetType="{x:Type ComboBoxItem}">
  <Border x:Name="Border"
          Padding="2"
          SnapsToDevicePixels="true"
          Background="{TemplateBinding Background}">
    <ContentPresenter />
  </Border>
</ControlTemplate>

Стили

<Style x:Key="ComboBox" TargetType="{x:Type ComboBox}">
  <Setter Property="SnapsToDevicePixels" Value="true" />
  <Setter Property="OverridesDefaultStyle" Value="true" />
  <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
  <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
  <Setter Property="ScrollViewer.CanContentScroll" Value="true" />
  <Setter Property="MinWidth" Value="120" />
  <Setter Property="MinHeight" Value="20" />
  <Setter Property="Background" Value="LightGray"/>
  <Setter Property="Foreground" Value="Black"/>
  <Setter Property="Template" Value="{StaticResource ComboBox.Template}"/>
  <Style.Triggers>
     <Trigger Property="IsMouseOver" Value="True">
        <Setter Property="Background" Value="White"/>
     </Trigger>
     <Trigger Property="IsDropDownOpen" Value="True">
        <Setter Property="Background" Value="White"/>
     </Trigger>
  </Style.Triggers>
</Style>


<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
  <Setter Property="SnapsToDevicePixels" Value="true" />
  <Setter Property="OverridesDefaultStyle" Value="true" />
  <Setter Property="Background" Value="White"/>
  <Setter Property="Foreground" Value="Black"/>
  <Setter Property="BorderBrush" Value="Black"/>
  <Setter Property="Template" Value="{StaticResource ComboBoxItem.Template}"/>
  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
      <Setter Property="Background" Value="DarkBlue"/>
      <Setter Property="Foreground" Value="White"/>
    </Trigger>
    <Trigger Property="IsFocused" Value="True">
      <Setter Property="Background" Value="DarkBlue"/>
      <Setter Property="Foreground" Value="White"/>
    </Trigger>
    <!-- Trigger for IsPressed somehow? -->
  </Style.Triggers>
</Style>

Большая часть кода не является необходимой, но я включил ее, так что другие могут скопируйте и вставьте, чтобы попробовать. * 103 4 *

Я также попытался отредактировать шаблон ComboBoxItem, добавив кнопку вокруг ContentPresenter, но это отключило событие выбора (поэтому вы не могли выбрать какой-либо элемент из comboBox)

Большинство из код из MSDN: Combobox-стили-и-шаблоны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...