C# 设置焦点上可编辑组合框的边框颜色
我想做的是设置可编辑组合框的边框笔刷。 我使用的是稍加修改的默认WPF模板。它们的结构如下:C# 设置焦点上可编辑组合框的边框颜色,c#,wpf,xaml,combobox,C#,Wpf,Xaml,Combobox,我想做的是设置可编辑组合框的边框笔刷。 我使用的是稍加修改的默认WPF模板。它们的结构如下: <ControlTemplate x:Key="ComboBoxEditableTemplate" TargetType="{x:Type ComboBox}"> ... <Grid x:Name="templateRoot" ...> ... <ToggleButton x:Name="toggleButton" ... /
<ControlTemplate x:Key="ComboBoxEditableTemplate" TargetType="{x:Type ComboBox}">
...
<Grid x:Name="templateRoot" ...>
...
<ToggleButton x:Name="toggleButton" ... />
<Border x:Name="border" ...>
<TextBox x:Name="PART_EditableTextBox" ... />
<!-- textbox with IsFocused property which should be focus trigger -->
</Border>
</Grid>
...
</ControlTemplate>
...
...
...
切换按钮模板:
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border x:Name="templateRoot" ...> <!-- first border brush I want to set on focus -->
<Border x:Name="innerBorder" ...> <!-- second border brush I want to set on focus -->
<Border x:Name="splitBorder" ...>
<Path x:Name="arrow" ... />
</Border>
</Border>
</Border>
</ControlTemplate>
现在,该怎么办
当PART\u EditableTextBox.IsFocused
等于true
然后将templateRoot.BorderBrush
和innerBorder.BorderBrush
设置为另一种颜色(例如[removed:red]红色和蓝色)
如果只需要设置一个BorderBrush
,这将非常简单,因为我可以使用TemplateBinding
将此属性绑定到ToggleButton
元素
对我来说,问题在于嵌套模板。我不知道如何引用另一个模板的内部内容。触发器可以为您解决此问题
<UserControl x:Class="Sample2.ContactSearchControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="75" Width="300">
<Border>
<Border.Style>
<Style TargetType="Border">
<Setter Property="Background" Value="White" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsFocused, ElementName=txtSearch}" Value="true">
<Setter Property="Background" Value="Black" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<StackPanel>
<TextBox x:Name="txtSearch" Text="Search" />
<TextBox Text="Other" />
</StackPanel>
</Border>
</UserControl>
您可以在ToggleButton部件中使用TemplateBinding,并将它们绑定到相同的属性。然后在触发器内更改它:
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" >
<!-- first border brush I want to set on focus -->
<Border x:Name="innerBorder" BorderBrush="{TemplateBinding BorderBrush}">
<!-- second border brush I want to set on focus -->
<Border x:Name="splitBorder" >
<Path x:Name="arrow" />
</Border>
</Border>
</Border>
</ControlTemplate>
然后在触发器内部组合框中设置togglebutton的边框笔刷:
<ControlTemplate TargetType="{x:Type ComboBox}">
<Grid x:Name="templateRoot" >
<ToggleButton x:Name="toggleButton" />
<Border x:Name="border" >
<TextBox x:Name="PART_EditableTextBox" />
<!-- textbox with IsFocused property which should be focus trigger -->
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="PART_EditableTextBox" Property="IsFocused" Value="True">
<Setter Property="BorderBrush" Value="Red" TargetName="toggleButton"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
更新
您可以将ToggleButton的ControlTemplate更改为如下所示:
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" >
<!-- first border brush I want to set on focus -->
<Border x:Name="innerBorder" BorderBrush="{Binding ElementName=templateRoot, Path=BorderBrush, Converter={SomeColorConverter}}">
<!-- second border brush I want to set on focus -->
<Border x:Name="splitBorder" >
<Path x:Name="arrow" />
</Border>
</Border>
</Border>
</ControlTemplate>
这样,一旦通过触发器更改了BorderBrush,您就可以触发绑定,并使用转换器设置不同的颜色。最后,我自己找到了解决方案。我扩展了
ToggleButton
类,因此它保存了额外的InnerBorderBrush
属性
现在,我可以用Setter
设置外边框和内边框:
<Trigger SourceName="PART_EditableTextBox" Property="IsFocused" Value="True">
<Setter Property="BorderBrush" Value="Red" TargetName="toggleButton">
<Setter Property="InnerBorderBrush" Value="Blue" TargetName="toggleButton"></Setter>
</Trigger>
差不多,但我需要将不同的颜色设置为
innerBorder
和templateRoot
public class ComboBoxToggleButton : ToggleButton
{
// Dependency Property
public static readonly DependencyProperty InnerBorderBrushProperty =
DependencyProperty.Register("InnerBorderBrush", typeof(Brush),
typeof(ComboBoxToggleButton), new FrameworkPropertyMetadata(Brushes.Transparent));
// .NET Property wrapper
public Brush InnerBorderBrush
{
get
{
return (Brush)GetValue(InnerBorderBrushProperty);
}
set
{
SetValue(InnerBorderBrushProperty, value);
}
}
}