如何将触发器写入文本框IskeyboardFocused属性

时间:2016-10-21 04:51:42

标签: c# wpf xaml

我正在尝试在关注文本框时更改其他UI元素可见性。我认为isKeyboardFocused事件可以解决我的问题。所以我写下我的xaml如下。

                <TextBox x:Name="SearchBox" Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch">
                    <i:Interaction.Triggers>
                        <e:PropertyChangedTrigger>
                            <i:Interaction.Behaviors>
                                <e:ConditionBehavior>
                                    <e:ConditionalExpression>
                                        <e:ComparisonCondition LeftOperand="{Binding SearchBox.IsKeyboardFocused}" Operator="Equal" RightOperand="rue" />
                                    </e:ConditionalExpression>
                                </e:ConditionBehavior>
                            </i:Interaction.Behaviors>
                            <e:ChangePropertyAction TargetName="SearchLabel" PropertyName="Visibility" Value="Hidden" />
                        </e:PropertyChangedTrigger>
                    </i:Interaction.Triggers>
                </TextBox>
                <TextBlock x:Name="SearchLabel" Text="Search" FontStyle="Italic" Foreground="Gray" IsHitTestVisible="False" Visibility="Visible" />

此触发器无效,我无法找到问题。我该怎么做才能解决这个问题或任何其他想法呢?

2 个答案:

答案 0 :(得分:1)

我会将klass.name.underscore绑定到Visibility属性,如下所示:

IsKeyboardFocused

使用自定义的<UserControl.Resources> <YourNamespace:BoolToVisConverter x:Key="BoolToVis" /> </UserControl.Resources> ... <TextBox x:Name="SearchBox" /> <Label Visibility="{Binding ElementName=SearchBox, Path=IsKeyboardFocused, Converter={StaticResource BoolToVis}, ConverterParameter='invert'}">hello</Label>

BoolToVisibilityConverter

public class BoolToVisConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (!(value is bool)) throw new ArgumentException("bool value expected"); Visibility invisibleMode = (parameter == null || !(parameter is string) || !((string) parameter).ToLower().Contains("hidden")) ? Visibility.Collapsed : Visibility.Hidden; if ((parameter as string)?.ToLower().Contains("invert") ?? false) return (!(bool) value) ? Visibility.Visible : invisibleMode; return ((bool) value) ? Visibility.Visible : invisibleMode; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 解析给定Converter字符串:   - &#34;反转&#34;:true - &gt;看不见的,假的 - &gt;可见   - &#34;隐藏&#34;:隐身案件会导致CommandParameter,否则会Visibilitys.Hidden

答案 1 :(得分:1)

好吧,我也找到了另一个能够轻松解决问题的答案。像我这样的问题可能也很有用。

<TextBox>
<TextBox.Style>
    <Style TargetType="TextBox" xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <Style.Resources>
            <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
                <VisualBrush.Visual>
                    <Label Content="Search" Foreground="LightGray" />
                </VisualBrush.Visual>
            </VisualBrush>
        </Style.Resources>
        <Style.Triggers>
            <Trigger Property="Text" Value="{x:Static sys:String.Empty}">
                <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
            </Trigger>
            <Trigger Property="Text" Value="{x:Null}">
                <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
            </Trigger>
            <Trigger Property="IsKeyboardFocused" Value="True">
                <Setter Property="Background" Value="White" />
            </Trigger>
        </Style.Triggers>
    </Style>
</TextBox.Style>
</TextBox>