1

ユーザーが入力している間、私の周りに素敵な小さなオレンジ色の境界線が欲しいですTextbox(フォーカスがあります)。

必要だと思われるトラのスタイルを定義しましたが、奇妙な動作があります。

カーソルが にTextBoxあり、WPF アプリにフォーカスがある場合、青い境界線が表示されます。

しかし、カーソルがフォーカスされ、アプリの外側 (ビジュアル スタジオのように) をクリックすると、オレンジ色になります。

多くのトリガーをオーバーライドしようとしましたが、役に立ちませんでした。

これは、テキスト ボックスに注目しているときに別のアプリに注目している場合に発生することです。

フォーカスはあるがアプリの外

これは、アプリ内のフォーカスのあるテキスト ボックスです。

アプリに集中

コードは次のとおりです。

CTRL XAML:

   <TextBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" 
                                         Style="{StaticResource RegistrationTextbox}" 
                                         IsReadOnly="{Binding Path=IsFirstNameReadOnly}" Text="{Binding FirstName}"  BorderThickness="0.99">
                                        <b:Interaction.Triggers>
                                            <b:EventTrigger EventName="GotFocus">
                                                <b:InvokeCommandAction Command="{Binding GotFocusFirstNameCommand}" />
                                            </b:EventTrigger>
                                        </b:Interaction.Triggers>
                                    </TextBox>

スタイル:

  <Style x:Key="RegistrationTextbox" TargetType="{x:Type TextBox}">
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>

    <Style.Triggers>
        <Trigger Property="IsReadOnly" Value="true">
            <Setter Property="Background" Value="#f2f2f2"/>
            <Setter Property="BorderBrush" Value="#f2f2f2"/>
            <Setter Property="BorderThickness" Value="2"/>
        </Trigger>
        <Trigger Property="IsKeyboardFocused" Value="true">
            <Setter Property="BorderBrush" Value="Red"/>
            <Setter Property="BorderThickness" Value="2"/>
        </Trigger>
        <Trigger Property="IsFocused"  Value="True">
            <Setter Property="BorderBrush" Value="#FAA634"/>
            <Setter Property="BorderThickness" Value="2"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="BorderBrush" Value="#F8B963"/>
            <Setter Property="BorderThickness" Value="2"/>
        </Trigger>
    </Style.Triggers>        
</Style>
4

1 に答える 1

3

ここでデフォルトの TextBox スタイルを見てみましょう: https://msdn.microsoft.com/en-us/library/cc645061%28v=vs.95%29.aspx

ControlTemplate に次のブロックがあることに気付くでしょう。

     <Border x:Name="Border" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1" Opacity="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
     <Grid>
           <Border x:Name="ReadOnlyVisualElement" Opacity="0" Background="#5EC9C9C9"/>
           <Border x:Name="MouseOverBorder" BorderThickness="1" BorderBrush="Transparent">
               <ScrollViewer x:Name="ContentElement" Padding="{TemplateBinding Padding}" BorderThickness="0" IsTabStop="False"/>
           </Border>
     </Grid>
     </Border>
     <Border x:Name="DisabledVisualElement" Background="#A5F7F7F7" BorderBrush="#A5F7F7F7" BorderThickness="{TemplateBinding BorderThickness}" Opacity="0" IsHitTestVisible="False"/>
     <Border x:Name="FocusVisualElement" BorderBrush="#FF6DBDD1" BorderThickness="{TemplateBinding BorderThickness}" Margin="1" Opacity="0" IsHitTestVisible="False"/>

ここでは、1 つの Border の BorderBrush のみが TextBox の BorderBrush プロパティにバインドされていることがわかります。コントロールがフォーカス状態になると、別の境界線 (FocusVisualElement) が表示され、後でビジュアル ツリーに配置されるため、通常の境界線をオーバーレイします。コントロールが無効または読み取り専用状態になる場合も同様です。したがって、スタイル セッターは基本的に効果がありません。

別のアプリに切り替えると、TextBox はそれがフォーカスされているとは見なしません (それを判断するために IsFocused プロパティを使用するだけではないことに注意してください)。そのため、FocusVisualElement が非表示になり、トリガーによって適用された境界線の色が表示されます。

簡単に言えば、コントロールの開発者は、考えられるすべての状態に対して単一の BorderBrush プロパティにバインドする必要はありません。彼らはFocusedBorderBrushプロパティのようなものを提供できたかもしれませんが、そうではありませんでした-したがって、TextBoxのControlTemplateを上書きする必要があります(上記のリンクで提供されているデフォルトのテンプレートを使用して、いくつかの色を上書きできます)。

于 2016-04-13T18:18:51.517 に答える