C# 使用触发器完成WPF中文本框中的事件作业

C# 使用触发器完成WPF中文本框中的事件作业,c#,wpf,xaml,styles,C#,Wpf,Xaml,Styles,嗨,我正在尝试将我正在做的事情从代码隐藏的事件中放入一个文本框中应用的样式的触发器中。我想要的是防止使用代码隐藏来实现这一点,并使用触发器。有没有办法做到这一点 我的文本框 <TextBox Name="myTextBox" Style="{StaticResource txtBoxStyle}"/> 我的风格 <Style x:Key="txtBoxStyle" TargetType="{x:Type TextBox}"> <Setter Proper

嗨,我正在尝试将我正在做的事情从代码隐藏的事件中放入一个文本框中应用的样式的触发器中。我想要的是防止使用代码隐藏来实现这一点,并使用触发器。有没有办法做到这一点

我的文本框

<TextBox Name="myTextBox"  Style="{StaticResource txtBoxStyle}"/>
我的风格

<Style x:Key="txtBoxStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Foreground" Value="Silver"/>
    <Setter Property="MaxLength" Value="6"/>
</Style>
来自代码隐藏的事件

private void myTextBox_LostFocus(object sender, RoutedEventArgs e)
{
    if (myTextBox.Text.Length == 0)
        myTextBox.Text = "000000";
}

private void myTextBox_GotFocus(object sender, RoutedEventArgs e)
{
    if (myTextBox.Text == "000000")
        myTextBox.Clear();
}

private void myTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (!(e.Key >= Key.D0 && e.Key <= Key.D9) && e.Key != Key.Back)
        e.Handled = true;
}

private void myTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    if (myTextBox.Text == "000000")
        myTextBox.Foreground = Brushes.Silver;
    else
    {                
        myTextBox.Foreground = Brushes.Black;

        if(myTextBox.Text.Length == 6)
            myButton.Visibility = Visibility.Visible;
        else
            myButton.Visibility = Visibility.Hidden;
    }
}
提前谢谢

Edit:对该逻辑使用触发器不是一个好主意,很可能会失败,因为它的自引用会导致堆栈溢出,值转换器也有点问题。要封装复杂逻辑并通过样式应用它,请使用

设置按钮可见性的逻辑不应在此样式中处理,而应由按钮处理。无法转换按键关闭事件

按钮样式:

<Style TargetType="{x:Type Button}">
    <Setter Property="Visibility" Value="Hidden"/> <!-- Normal state -->
    <Style.Triggers>
        <DataTrigger Binding="{Binding Text.Length, ElementName=myButton}" Value="6">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
编辑:对这个逻辑使用触发器不是一个好主意,很可能会失败,因为它的自引用会导致堆栈溢出,值转换器也有点问题。要封装复杂逻辑并通过样式应用它,请使用

设置按钮可见性的逻辑不应在此样式中处理,而应由按钮处理。无法转换按键关闭事件

按钮样式:

<Style TargetType="{x:Type Button}">
    <Setter Property="Visibility" Value="Hidden"/> <!-- Normal state -->
    <Style.Triggers>
        <DataTrigger Binding="{Binding Text.Length, ElementName=myButton}" Value="6">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

如果我这样做,则当文本框增益焦点给我此异常文本“Storyboard.TargetProperty路径包含不可动画的属性“Text”时,会有默认setter out-of触发器。。你能解释一下为什么吗?是的,你不能给它设置动画;无论如何,使用动画是没有必要的,因为我们处理的是一个状态,而不是一个事件。我将答案改为使用setter,它应该可以工作并产生相同的结果。这很不幸,但这可能是使用样式所能得到的最接近的结果。我自己可能不会这样做,基本上你只是希望一个空字符串显示为6个零,因为我会使用一个带ValueConverter的绑定。实际上这会导致堆栈溢出异常。基本上,您不应该使用触发器,其条件是触发器触发时将设置的属性。对于我来说,如果我使用Text=,也应该使用Text=,但我尝试了使用Text={x:Null},但它们都不起作用。如果我这样做,则默认setter没有触发器,当文本框获得焦点给我此异常文本“Storyboard.TargetProperty路径包含不可动画的属性“Text”时。。你能解释一下为什么吗?是的,你不能给它设置动画;无论如何,使用动画是没有必要的,因为我们处理的是一个状态,而不是一个事件。我将答案改为使用setter,它应该可以工作并产生相同的结果。这很不幸,但这可能是使用样式所能得到的最接近的结果。我自己可能不会这样做,基本上你只是希望一个空字符串显示为6个零,因为我会使用一个带ValueConverter的绑定。实际上这会导致堆栈溢出异常。基本上,您不应该使用触发器,触发器的条件是触发器触发时将设置的属性。对于我来说,如果使用Text=,也不应该使用触发器,但我尝试了使用Text={x:Null},但没有一个有效。