当WPF无效时,WPF将ComboBox TextBox背景变为红色

时间:2018-04-11 17:34:47

标签: wpf

我正在开发一个我称之为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实际显示我设置的背景,这就是我所要求的为了你的帮助。

0 个答案:

没有答案