我正在开发一个我称之为EnhancedComboBox的自定义控件,我希望它能为标准的ComboBox提供一些增强功能。如果焦点位于控件上,则TextBox部分背景为黄色,但TextBox中的文本与所选项目不匹配,或者当焦点偏离控件时满足相同条件时为红色
我花了最后一天半在网上搜索这方面的帮助,但是没有找到这个确切的条件,也没有找到关于为什么作者的充分解释正如他所做的那样写xaml。 控件的构建和操作都很好,但背景颜色不会改变。有人可以看看下面的我的xaml并告诉我我错过了什么/做错了什么?感谢。
<ComboBox x:Class="CHIMS_Data_Entry_Controls.EnhancedComboBox"
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"
xmlns:local="clr-namespace:CHIMS_Data_Entry_Controls"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
IsEditable="True" IsReadOnly="True">
<ComboBox.Resources>
<Color x:Key="CautionColor">#FFFFFF00</Color>
<Color x:Key="ErrorColor">#FFFF0000</Color>
<Style x:Key="EnhancedComboBox" TargetType="local:EnhancedComboBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:EnhancedComboBox">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ValidationStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="InvalidFocused">
<Storyboard>
<ColorAnimationUsingKeyFrames
Storyboard.TargetName="PART_EditableTextBox"
Storyboard.TargetProperty="(TextElement.Background).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="{StaticResource CautionColor}"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="InvalidUnfocused">
<Storyboard>
<ColorAnimationUsingKeyFrames
Storyboard.TargetName="PART_EditableTextBox"
Storyboard.TargetProperty="(TextElement.Background).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="{StaticResource ErrorColor}"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ComboBox.Resources>
</ComboBox>
在回应Andy的评论时,我已经尝试编写代码隐藏来处理这个问题,并且已经取得了更大的成功。我已经跟踪了代码并发现它找到了ComboBox的TextBox,甚至将其Background设置为正确的颜色。但是,实际上并没有显示颜色。
我知道这些控件使用它们的默认颜色和行为,即使以编程方式对它们进行编写,那么如何让控件实际显示我想要的颜色呢?
这是我的代码隐藏:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;
namespace CHIMS_Data_Entry_Controls
{
/// <summary>
/// Interaction logic for EnhancedComboBox.xaml
/// </summary>
public partial class EnhancedComboBox : ComboBox
{
private Brush _defaultBackground;
public EnhancedComboBox()
{
InitializeComponent();
_defaultBackground = Background;
}
protected override void OnGotFocus(RoutedEventArgs e)
{
if (IsTextInList)
{
_myTextBox.Background = _defaultBackground;
}
else
{
_myTextBox.Background = Brushes.Yellow;
}
}
protected override void OnLostFocus(RoutedEventArgs e)
{
if (IsTextInList)
{
_myTextBox.Background = _defaultBackground;
}
else
{
_myTextBox.Background = Brushes.Red;
}
}
public bool IsTextInList
{
get
{
bool _isFound = false;
string _wasFound = " not";
foreach (string Element in Items)
{
if (Text == Element)
{
_isFound = true;
_wasFound = "";
break;
}
}
return _isFound;
}
}
}
}
现在,我知道这只会在进入或离开控件时触发,而不是在TextBox中的文本发生变化时触发,但直到我找到一种方法来捕获TextBox的OnTextChanged,这至少必须这样做,至少证明我可以在背景中实现所需的变化。
在这一点上,我觉得对于我来说代码回归的关键在于弄清楚如何让TextBox实际显示我设置的背景,这就是我所要求的为了你的帮助。