2016-10-21 3 views
1

テキストボックスがフォーカスされているときに他のUI要素の表示を変更しようとしています。私はisKeyboardFocusedイベントが私の問題を解決するかもしれないと思う。だから私は次のように私のxamlを書く。テキストボックスにトリガを書き込む方法IskeyboardFocusedプロパティ

   <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" /> 

このトリガーは機能していないため、問題を見つけることができませんでした。私はこの問題やそれに関する他のアイデアを修正するために何ができますか?

答えて

1

次のように私はIsKeyboardFocusedプロパティにVisibilityを結合する:

カスタマイズ BoolToVisibilityConverterを使用して
<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> 

を:

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(); 
    } 
} 

ためCommandParameter文字列を与えられたConverterパース: は - "反転":真の - >目に見えない、間違っている - >目に見える - "隠された":目に見えない場合Visibilitys.Hiddenにつながる、 s Visibility.Collapsed

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> 
+0

この回答はあなたの質問とは関係ありません。 TextBoxの値に応じて、別のコントロールプロパティを設定するという問題に文脈はありません。これを正しい答えとすることは正しいとは言えませんでした。 – WPFGermany

+0

私は、テキストボックス内に検索ラベルを使用して、ユーザにプロンプ​​トを表示する必要がありました。可視性を無効にすることに集中しているときこの解決策もうまくいきます。だから私はこの答えを使うことにしました。 –

+0

あなたが質問した質問とタイトル(テキストボックスにフォーカスしているときに他のUI要素の表示を変更しようとしています)は、この回答とは関係ありません!他の人がこの質問を読んで、同じ問題をコントロール間で引き起こしてしまうと、これで修正されません!したがって、この質問に対する最良の答えにはなりません! – WPFGermany

関連する問題