尝试在 WPF 中设置组合框的背景
Posted
技术标签:
【中文标题】尝试在 WPF 中设置组合框的背景【英文标题】:Trying to set the Background of a combobox in WPF 【发布时间】:2016-05-10 11:31:37 【问题描述】:我正在自定义我的验证在我的 WPF 应用程序中的显示方式。我的应用程序只有一个 style.xaml,我的大多数控件样式都类似于以下文本框样式。
<Style x:Key="TextBoxInputField" TargetType="TextBox" BasedOn="StaticResource TextBoxFieldBase">
<Setter Property="ToolTip" Value="Binding RelativeSource=RelativeSource Self, Path=(Validation.Errors), Converter=converters:ValidationErrorsToErrorMessagesConverter" />
<Setter Property="Background" Value="Binding RelativeSource=RelativeSource Self, Path=(Validation.Errors), Converter=converters:ValidationErrorsToBackgroundColorConverter" />
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这会根据绑定的属性是否有验证错误来设置工具提示和背景。但是当我尝试与组合框样式类似的东西时,背景是根据 Snoop 设置的,但组合框在 UI 中不会显示为黄色。
<Style x:Key="ComboBoxValidation" TargetType="ComboBox" BasedOn="StaticResource ComboBox">
<Setter Property="Background" Value="Binding RelativeSource=RelativeSource Self, Path=(Validation.Errors), Converter=converters:ValidationErrorsToBackgroundColorConverter" />
<Setter Property="ToolTip" Value="Binding RelativeSource=RelativeSource Self, Path=(Validation.Errors), Converter=converters:ValidationErrorsToErrorMessagesConverter" />
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如何更改组合框的背景以在 UI 中显示?
【问题讨论】:
***.com/questions/22695145/… 和 social.technet.microsoft.com/wiki/contents/articles/… 我在更改背景颜色方面一直遇到相同的建议,但在将其应用于我正在尝试做的 Validation.ErrorTemplate 时我遗漏了一些东西。 Validation.ErrorTemplate 将成为组合框顶部的装饰器,因此您无法真正更改其下方的组合框。您可以在其上放置一个不可见的半透明边框...我在一年前遇到过这个问题,它与使用 OS Windows 样式的组合框的 WPF 有关,无论您的背景颜色如何。要解决这个问题,您需要完全定义组合框样式。我创建了这个组合框样式,它需要调整,但可以给你一个想法。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="ComboBoxNormalBorderBrush" Color="#e3e9ef" />
<SolidColorBrush x:Key="ComboBoxNormalBackgroundBrush" Color="#fff" />
<SolidColorBrush x:Key="ComboBoxDisabledForegroundBrush" Color="#888" />
<SolidColorBrush x:Key="ComboBoxDisabledBackgroundBrush" Color="#eee" />
<SolidColorBrush x:Key="ComboBoxDisabledBorderBrush" Color="#888" />
<ControlTemplate TargetType="ToggleButton" x:Key="ComboBoxToggleButtonTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="16" />
</Grid.ColumnDefinitions>
<Border Grid.ColumnSpan="2" Name="Border" BorderBrush="Transparent" CornerRadius="0" BorderThickness="1, 1, 1, 1" Background="Transparent" />
<Border Grid.Column="1" Margin="1, 1, 1, 1" BorderBrush="#444" Name="ButtonBorder" CornerRadius="0, 0, 0, 0" BorderThickness="0, 0, 0, 0" Background="Blue" />
<Path x:Name="Arrow" Grid.Column="1" HorizontalAlignment="Center" Margin="1,-1,0,0" VerticalAlignment="Center" Data="M 0 0 L 4 4 L 8 0 Z" Fill="#FFDDDDDD"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="UIElement.IsMouseOver" Value="True">
<Setter Property="Panel.Background" TargetName="ButtonBorder" Value="#FF4444FF"/>
<Setter Property="Shape.Fill" TargetName="Arrow" Value="White" />
</Trigger>
<Trigger Property="UIElement.IsMouseOver" Value="False">
<Setter Property="Panel.Background" TargetName="ButtonBorder" Value="Blue"/>
<Setter Property="Shape.Fill" TargetName="Arrow" Value="White" />
</Trigger>
<Trigger Property="ToggleButton.IsChecked" Value="True">
<Setter Property="Panel.Background" TargetName="ButtonBorder" Value="WhiteSmoke"/>
<Setter Property="Shape.Fill" TargetName="Arrow" Value="#FF8D979E"/>
</Trigger>
<Trigger Property="UIElement.IsEnabled" Value="False">
<Setter Property="Panel.Background" TargetName="Border" Value="#eee"/>
<Setter Property="Panel.Background" TargetName="ButtonBorder" Value="#eee"/>
<Setter Property="Border.BorderBrush" TargetName="ButtonBorder" Value="#888"/>
<Setter Property="TextElement.Foreground" Value="#888"/>
<Setter Property="Shape.Fill" TargetName="Arrow" Value="#999"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="ComboBoxFlatStyle" TargetType="x:Type ComboBox">
<Setter Property="UIElement.SnapsToDevicePixels" Value="True"/>
<Setter Property="FrameworkElement.OverridesDefaultStyle" Value="True"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
<Setter Property="TextElement.Foreground" Value="Black"/>
<Setter Property="FrameworkElement.FocusVisualStyle" Value="x:Null"/>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBox">
<Grid>
<ToggleButton Name="PART_ToggleButton" Grid.Column="2" ClickMode="Press" Focusable="False" IsChecked="Binding Path=IsDropDownOpen, RelativeSource=RelativeSource TemplatedParent, Mode=TwoWay" Template="StaticResource ComboBoxToggleButtonTemplate"/>
<ContentPresenter Name="ContentSite" Margin="5, 3, 23, 3" IsHitTestVisible="False" HorizontalAlignment="Left" VerticalAlignment="Center" Content="TemplateBinding ComboBox.SelectionBoxItem" ContentTemplate="TemplateBinding ComboBox.SelectionBoxItemTemplate" ContentTemplateSelector="TemplateBinding ItemTemplateSelector"/>
<TextBox Name="PART_EditableTextBox" Margin="3, 3, 23, 3" IsReadOnly="TemplateBinding IsReadOnly" Visibility="Hidden" Background="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Center" Focusable="True" >
<TextBox.Template>
<ControlTemplate TargetType="TextBox" >
<Border Name="PART_ContentHost" Focusable="False" />
</ControlTemplate>
</TextBox.Template>
</TextBox>
<Border Name="OutlineBoder" BorderBrush="LightBlue" IsHitTestVisible="False" />
<!-- Popup showing items -->
<Popup Name="PART_Popup" Placement="Bottom" Focusable="False" AllowsTransparency="True" IsOpen="TemplateBinding ComboBox.IsDropDownOpen" PopupAnimation="Slide">
<Grid Name="DropDown" SnapsToDevicePixels="True" MinWidth="TemplateBinding FrameworkElement.ActualWidth" MaxHeight="TemplateBinding ComboBox.MaxDropDownHeight">
<Border Name="DropDownBorder" Background="White" Margin="0, 1, 0, 0" CornerRadius="0" BorderThickness="1,1,1,1" BorderBrush="StaticResource ComboBoxNormalBorderBrush"/>
<ScrollViewer Margin="4" SnapsToDevicePixels="True">
<ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained" />
</ScrollViewer>
</Grid>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" TargetName="PART_ToggleButton" Value="LightBlue" />
</Trigger>
<Trigger Property="ItemsControl.HasItems" Value="False">
<Setter Property="FrameworkElement.MinHeight" TargetName="DropDownBorder" Value="95"/>
</Trigger>
<Trigger Property="UIElement.IsEnabled" Value="False">
<Setter Property="TextElement.Foreground" Value="#888"/>
</Trigger>
<Trigger Property="ItemsControl.IsGrouping" Value="True">
<Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
</Trigger>
<Trigger Property="ComboBox.IsEditable" Value="True">
<Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
<Setter Property="UIElement.Visibility" TargetName="PART_EditableTextBox" Value="Visible"/>
<Setter Property="UIElement.Visibility" TargetName="ContentSite" Value="Hidden"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
【讨论】:
这是我最终使用的,有一个警告。当我尝试在 Win 7 机器上使用 Win 10(我正在使用的)派生模板时,应用程序在启动时引发异常。我最终不得不使用带有编辑功能的 Win 7 派生模板,这似乎适用于两种操作系统。【参考方案2】:我使用 VS 中的“文档大纲”窗口为组合框创建了一个模板。我尽量保持与您大部分使用的名称相匹配。我试图发布附带的代码,但它超过了字符限制以获得答案。 XAML 有很多值得一看的地方......我想我所做的只是改变了几个地方的 Background="TemplateBinding Background" 以及使用您的转换器的部分。
XAML:
<Window x:Class="WpfApplication5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication5"
xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2">
<Window.Resources>
<local:ValidationErrorsToBackgroundColorConverter x:Key="ValidationErrorsToBackgroundColorConverter" />
<local:ValidationErrorsToErrorMessagesConverter x:Key="ValidationErrorsToErrorMessagesConverter" />
<Style x:Key="FocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="DynamicResource x:Static SystemColors.ControlTextBrushKey" StrokeThickness="1" StrokeDashArray="1 2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<SolidColorBrush x:Key="ComboBox.Static.Border" Color="#FFACACAC"/>
<SolidColorBrush x:Key="ComboBox.Static.Editable.Background" Color="#FFFFFFFF"/>
<SolidColorBrush x:Key="ComboBox.Static.Editable.Border" Color="#FFABADB3"/>
<SolidColorBrush x:Key="ComboBox.Static.Editable.Button.Background" Color="Transparent"/>
<SolidColorBrush x:Key="ComboBox.Static.Editable.Button.Border" Color="Transparent"/>
<SolidColorBrush x:Key="ComboBox.MouseOver.Glyph" Color="#FF000000"/>
<LinearGradientBrush x:Key="ComboBox.MouseOver.Background" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFECF4FC" Offset="0.0"/>
<GradientStop Color="#FFDCECFC" Offset="1.0"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="ComboBox.MouseOver.Border" Color="#FF7EB4EA"/>
<SolidColorBrush x:Key="ComboBox.MouseOver.Editable.Background" Color="#FFFFFFFF"/>
<SolidColorBrush x:Key="ComboBox.MouseOver.Editable.Border" Color="#FF7EB4EA"/>
<LinearGradientBrush x:Key="ComboBox.MouseOver.Editable.Button.Background" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFEBF4FC" Offset="0.0"/>
<GradientStop Color="#FFDCECFC" Offset="1.0"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="ComboBox.MouseOver.Editable.Button.Border" Color="#FF7EB4EA"/>
<SolidColorBrush x:Key="ComboBox.Pressed.Glyph" Color="#FF000000"/>
<LinearGradientBrush x:Key="ComboBox.Pressed.Background" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFDAECFC" Offset="0.0"/>
<GradientStop Color="#FFC4E0FC" Offset="1.0"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="ComboBox.Pressed.Border" Color="#FF569DE5"/>
<SolidColorBrush x:Key="ComboBox.Pressed.Editable.Background" Color="#FFFFFFFF"/>
<SolidColorBrush x:Key="ComboBox.Pressed.Editable.Border" Color="#FF569DE5"/>
<LinearGradientBrush x:Key="ComboBox.Pressed.Editable.Button.Background" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFDAEBFC" Offset="0.0"/>
<GradientStop Color="#FFC4E0FC" Offset="1.0"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="ComboBox.Pressed.Editable.Button.Border" Color="#FF569DE5"/>
<SolidColorBrush x:Key="ComboBox.Disabled.Glyph" Color="#FFBFBFBF"/>
<SolidColorBrush x:Key="ComboBox.Disabled.Background" Color="#FFF0F0F0"/>
<SolidColorBrush x:Key="ComboBox.Disabled.Border" Color="#FFD9D9D9"/>
<SolidColorBrush x:Key="ComboBox.Disabled.Editable.Background" Color="#FFFFFFFF"/>
<SolidColorBrush x:Key="ComboBox.Disabled.Editable.Border" Color="#FFBFBFBF"/>
<SolidColorBrush x:Key="ComboBox.Disabled.Editable.Button.Background" Color="Transparent"/>
<SolidColorBrush x:Key="ComboBox.Disabled.Editable.Button.Border" Color="Transparent"/>
<SolidColorBrush x:Key="ComboBox.Static.Glyph" Color="#FF606060"/>
<Style x:Key="ComboBoxToggleButton" TargetType="x:Type ToggleButton">
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="IsTabStop" Value="false"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="ClickMode" Value="Press"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type ToggleButton">
<Border x:Name="templateRoot" BorderBrush="StaticResource ComboBox.Static.Border" BorderThickness="TemplateBinding BorderThickness" Background="TemplateBinding Background" SnapsToDevicePixels="true">
<Border x:Name="splitBorder" BorderBrush="Transparent" BorderThickness="1" HorizontalAlignment="Right" Margin="0" SnapsToDevicePixels="true" Width="DynamicResource x:Static SystemParameters.VerticalScrollBarWidthKey">
<Path x:Name="arrow" Data="F1 M 0,0 L 2.667,2.66665 L 5.3334,0 L 5.3334,-1.78168 L 2.6667,0.88501 L0,-1.78168 L0,0 Z" Fill="StaticResource ComboBox.Static.Glyph" HorizontalAlignment="Center" Margin="0" VerticalAlignment="Center"/>
</Border>
</Border>
<ControlTemplate.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="Binding IsEditable, RelativeSource=RelativeSource AncestorType=x:Type ComboBox" Value="true"/>
<Condition Binding="Binding IsMouseOver, RelativeSource=RelativeSource Self" Value="false"/>
<Condition Binding="Binding IsPressed, RelativeSource=RelativeSource Self" Value="false"/>
<Condition Binding="Binding IsEnabled, RelativeSource=RelativeSource Self" Value="true"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" TargetName="templateRoot" Value="StaticResource ComboBox.Static.Editable.Background"/>
<Setter Property="BorderBrush" TargetName="templateRoot" Value="StaticResource ComboBox.Static.Editable.Border"/>
<Setter Property="Background" TargetName="splitBorder" Value="StaticResource ComboBox.Static.Editable.Button.Background"/>
<Setter Property="BorderBrush" TargetName="splitBorder" Value="StaticResource ComboBox.Static.Editable.Button.Border"/>
</MultiDataTrigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Fill" TargetName="arrow" Value="StaticResource ComboBox.MouseOver.Glyph"/>
</Trigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="Binding IsMouseOver, RelativeSource=RelativeSource Self" Value="true"/>
<Condition Binding="Binding IsEditable, RelativeSource=RelativeSource AncestorType=x:Type ComboBox" Value="false"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" TargetName="templateRoot" Value="StaticResource ComboBox.MouseOver.Background"/>
<Setter Property="BorderBrush" TargetName="templateRoot" Value="StaticResource ComboBox.MouseOver.Border"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="Binding IsMouseOver, RelativeSource=RelativeSource Self" Value="true"/>
<Condition Binding="Binding IsEditable, RelativeSource=RelativeSource AncestorType=x:Type ComboBox" Value="true"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" TargetName="templateRoot" Value="StaticResource ComboBox.MouseOver.Editable.Background"/>
<Setter Property="BorderBrush" TargetName="templateRoot" Value="StaticResource ComboBox.MouseOver.Editable.Border"/>
<Setter Property="Background" TargetName="splitBorder" Value="StaticResource ComboBox.MouseOver.Editable.Button.Background"/>
<Setter Property="BorderBrush" TargetName="splitBorder" Value="StaticResource ComboBox.MouseOver.Editable.Button.Border"/>
</MultiDataTrigger>
<Trigger Property="IsPressed" Value="true">
<Setter Property="Fill" TargetName="arrow" Value="StaticResource ComboBox.Pressed.Glyph"/>
</Trigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="Binding IsPressed, RelativeSource=RelativeSource Self" Value="true"/>
<Condition Binding="Binding IsEditable, RelativeSource=RelativeSource AncestorType=x:Type ComboBox" Value="false"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" TargetName="templateRoot" Value="StaticResource ComboBox.Pressed.Background"/>
<Setter Property="BorderBrush" TargetName="templateRoot" Value="StaticResource ComboBox.Pressed.Border"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="Binding IsPressed, RelativeSource=RelativeSource Self" Value="true"/>
<Condition Binding="Binding IsEditable, RelativeSource=RelativeSource AncestorType=x:Type ComboBox" Value="true"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" TargetName="templateRoot" Value="StaticResource ComboBox.Pressed.Editable.Background"/>
<Setter Property="BorderBrush" TargetName="templateRoot" Value="StaticResource ComboBox.Pressed.Editable.Border"/>
<Setter Property="Background" TargetName="splitBorder" Value="StaticResource ComboBox.Pressed.Editable.Button.Background"/>
<Setter Property="BorderBrush" TargetName="splitBorder" Value="StaticResource ComboBox.Pressed.Editable.Button.Border"/>
</MultiDataTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Fill" TargetName="arrow" Value="StaticResource ComboBox.Disabled.Glyph"/>
</Trigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="Binding IsEnabled, RelativeSource=RelativeSource Self" Value="false"/>
<Condition Binding="Binding IsEditable, RelativeSource=RelativeSource AncestorType=x:Type ComboBox" Value="false"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" TargetName="templateRoot" Value="StaticResource ComboBox.Disabled.Background"/>
<Setter Property="BorderBrush" TargetName="templateRoot" Value="StaticResource ComboBox.Disabled.Border"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="Binding IsEnabled, RelativeSource=RelativeSource Self" Value="false"/>
<Condition Binding="Binding IsEditable, RelativeSource=RelativeSource AncestorType=x:Type ComboBox" Value="true"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" TargetName="templateRoot" Value="StaticResource ComboBox.Disabled.Editable.Background"/>
<Setter Property="BorderBrush" TargetName="templateRoot" Value="StaticResource ComboBox.Disabled.Editable.Border"/>
<Setter Property="Background" TargetName="splitBorder" Value="StaticResource ComboBox.Disabled.Editable.Button.Background"/>
<Setter Property="BorderBrush" TargetName="splitBorder" Value="StaticResource ComboBox.Disabled.Editable.Button.Border"/>
</MultiDataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="ComboBoxTemplate" TargetType="x:Type ComboBox">
<Grid x:Name="templateRoot" SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition MinWidth="DynamicResource x:Static SystemParameters.VerticalScrollBarWidthKey" Width="0"/>
</Grid.ColumnDefinitions>
<Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="Binding IsDropDownOpen, Mode=TwoWay, RelativeSource=RelativeSource TemplatedParent" Margin="1" PopupAnimation="DynamicResource x:Static SystemParameters.ComboBoxPopupAnimationKey" Placement="Bottom">
<Themes:SystemDropShadowChrome x:Name="shadow" Color="Transparent" MaxHeight="TemplateBinding MaxDropDownHeight" MinWidth="Binding ActualWidth, ElementName=templateRoot">
<Border x:Name="dropDownBorder" BorderBrush="DynamicResource x:Static SystemColors.WindowFrameBrushKey" BorderThickness="1" Background="DynamicResource x:Static SystemColors.WindowBrushKey">
<ScrollViewer x:Name="DropDownScrollViewer">
<Grid x:Name="grid" RenderOptions.ClearTypeHint="Enabled">
<Canvas x:Name="canvas" HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
<Rectangle x:Name="opaqueRect" Fill="Binding Background, ElementName=dropDownBorder" Height="Binding ActualHeight, ElementName=dropDownBorder" Width="Binding ActualWidth, ElementName=dropDownBorder"/>
</Canvas>
<ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels"/>
</Grid>
</ScrollViewer>
</Border>
</Themes:SystemDropShadowChrome>
</Popup>
<ToggleButton x:Name="toggleButton" BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" Background="TemplateBinding Background" Grid.ColumnSpan="2" IsChecked="Binding IsDropDownOpen, Mode=TwoWay, RelativeSource=RelativeSource TemplatedParent" Style="StaticResource ComboBoxToggleButton"/>
<ContentPresenter x:Name="contentPresenter" ContentTemplate="TemplateBinding SelectionBoxItemTemplate" ContentTemplateSelector="TemplateBinding ItemTemplateSelector" Content="TemplateBinding SelectionBoxItem" ContentStringFormat="TemplateBinding SelectionBoxItemStringFormat" HorizontalAlignment="TemplateBinding HorizontalContentAlignment" IsHitTestVisible="false" Margin="TemplateBinding Padding" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" VerticalAlignment="TemplateBinding VerticalContentAlignment"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
<Setter Property="Margin" TargetName="shadow" Value="0,0,5,5"/>
<Setter Property="Color" TargetName="shadow" Value="#71000000"/>
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter Property="Height" TargetName="dropDownBorder" Value="95"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsGrouping" Value="true"/>
<Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</MultiTrigger>
<Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
<Setter Property="Canvas.Top" TargetName="opaqueRect" Value="Binding VerticalOffset, ElementName=DropDownScrollViewer"/>
<Setter Property="Canvas.Left" TargetName="opaqueRect" Value="Binding HorizontalOffset, ElementName=DropDownScrollViewer"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="ComboBoxEditableTextBox" TargetType="x:Type TextBox">
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="AllowDrop" Value="true"/>
<Setter Property="MinWidth" Value="0"/>
<Setter Property="MinHeight" Value="0"/>
<Setter Property="FocusVisualStyle" Value="x:Null"/>
<Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type TextBox">
<ScrollViewer x:Name="PART_ContentHost" Background="Transparent" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="ComboBoxEditableTemplate" TargetType="x:Type ComboBox">
<Grid x:Name="templateRoot" SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition MinWidth="DynamicResource x:Static SystemParameters.VerticalScrollBarWidthKey" Width="0"/>
</Grid.ColumnDefinitions>
<Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="Binding IsDropDownOpen, RelativeSource=RelativeSource TemplatedParent" PopupAnimation="DynamicResource x:Static SystemParameters.ComboBoxPopupAnimationKey" Placement="Bottom">
<Themes:SystemDropShadowChrome x:Name="shadow" Color="Transparent" MaxHeight="TemplateBinding MaxDropDownHeight" MinWidth="Binding ActualWidth, ElementName=templateRoot">
<Border x:Name="dropDownBorder" BorderBrush="DynamicResource x:Static SystemColors.WindowFrameBrushKey" BorderThickness="1" Background="DynamicResource x:Static SystemColors.WindowBrushKey">
<ScrollViewer x:Name="DropDownScrollViewer">
<Grid x:Name="grid" RenderOptions.ClearTypeHint="Enabled">
<Canvas x:Name="canvas" HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
<Rectangle x:Name="opaqueRect" Fill="Binding Background, ElementName=dropDownBorder" Height="Binding ActualHeight, ElementName=dropDownBorder" Width="Binding ActualWidth, ElementName=dropDownBorder"/>
</Canvas>
<ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels"/>
</Grid>
</ScrollViewer>
</Border>
</Themes:SystemDropShadowChrome>
</Popup>
<ToggleButton x:Name="toggleButton" BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" Background="TemplateBinding Background" Grid.ColumnSpan="2" IsChecked="Binding IsDropDownOpen, Mode=TwoWay, RelativeSource=RelativeSource TemplatedParent" Style="StaticResource ComboBoxToggleButton"/>
<Border x:Name="border" Background="TemplateBinding Background" Margin="TemplateBinding BorderThickness">
<TextBox x:Name="PART_EditableTextBox" HorizontalContentAlignment="TemplateBinding HorizontalContentAlignment" IsReadOnly="Binding IsReadOnly, RelativeSource=RelativeSource TemplatedParent" Margin="TemplateBinding Padding" Style="StaticResource ComboBoxEditableTextBox" VerticalContentAlignment="TemplateBinding VerticalContentAlignment"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Opacity" TargetName="border" Value="0.56"/>
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="true">
<Setter Property="Foreground" Value="Black"/>
</Trigger>
<Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
<Setter Property="Margin" TargetName="shadow" Value="0,0,5,5"/>
<Setter Property="Color" TargetName="shadow" Value="#71000000"/>
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter Property="Height" TargetName="dropDownBorder" Value="95"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsGrouping" Value="true"/>
<Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</MultiTrigger>
<Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
<Setter Property="Canvas.Top" TargetName="opaqueRect" Value="Binding VerticalOffset, ElementName=DropDownScrollViewer"/>
<Setter Property="Canvas.Left" TargetName="opaqueRect" Value="Binding HorizontalOffset, ElementName=DropDownScrollViewer"/>
</Trigger>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="Binding RelativeSource=RelativeSource Self, Path=(Validation.Errors), Converter=StaticResource ValidationErrorsToErrorMessagesConverter"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="ComboBoxValidation" TargetType="x:Type ComboBox">
<Setter Property="FocusVisualStyle" Value="StaticResource FocusVisual"/>
<Setter Property="Background" Value="Binding RelativeSource=RelativeSource Self, Path=(Validation.Errors), Converter=StaticResource ValidationErrorsToBackgroundColorConverter"/>
<Setter Property="ToolTip" Value="Binding RelativeSource=RelativeSource Self, Path=(Validation.Errors), Converter=StaticResource ValidationErrorsToErrorMessagesConverter"/>
<Setter Property="BorderBrush" Value="StaticResource ComboBox.Static.Border"/>
<Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.WindowTextBrushKey"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="Padding" Value="6,3,5,3"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
<Setter Property="ScrollViewer.PanningMode" Value="Both"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="Template" Value="StaticResource ComboBoxTemplate"/>
<Style.Triggers>
<Trigger Property="IsEditable" Value="true">
<Setter Property="IsTabStop" Value="false"/>
<Setter Property="Padding" Value="2"/>
<Setter Property="Template" Value="StaticResource ComboBoxEditableTemplate"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<ComboBox Margin="5" Style="DynamicResource ComboBoxValidation">
<ComboBox.SelectedItem>
<Binding Path="SelectedItem" Mode="OneWayToSource">
<Binding.ValidationRules>
<local:ComboBoxItemValidation />
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedItem>
<ComboBoxItem Content="Item 1" IsSelected="True" />
<ComboBoxItem Content="Item 2" />
</ComboBox>
</StackPanel>
</Window>
【讨论】:
以上是关于尝试在 WPF 中设置组合框的背景的主要内容,如果未能解决你的问题,请参考以下文章
基于另一个组合在 ExtJs 中的 EditableGrid 中设置组合框的存储
WPF DataGrid - 从 DataGrid ItemsSource 对象的集合值中设置唯一的每行(对象)组合框值