ExpressionBlendで一種のカスタムTextBox
を作成しました。背景と境界線の塗りつぶしをグラデーションに変更し、シャドウ効果を追加しました。
TextBox
にマウスオーバーまたはフォーカスすると、WPFのデフォルトの動作/(スタイル?)が引き継がれ、境界線が変更されることに気付きました。
フォーカスまたはマウスオーバーしたときに、WPFがTextBox
esスタイルを変更するのを防止または停止する方法があるかどうか疑問に思いました。これは可能ですか?
カスタムスタイルでOverridesDefaultStyle
プロパティをtrue
に設定しますか?これにより、デフォルト値がデフォルトスタイルから描画されるのを防ぐことができると思います。
もしそうなら、そしてこれが機能していない(またはあなたがあなたのownボーダーを使いたい)、私が考えることができるのはあなたがオーバーライドする必要があるということだけですStyle
/ControlTemplate
で Trigger を使用して、適切なプロパティが変更された場合のデフォルトのスタイル設定メカニズム:
<Style x:Key="Triggers" TargetType="TextBox">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property = "BorderBrush" Value="{Binding ToYourBorder}"/>
</Trigger>
</Style.Triggers>
</Style>
より簡単な解決策は、texboxの境界線の太さを0に設定してから、texboxを独自の境界線にラップすることです。
<Border BorderBrush="LightGray" BorderThickness="1">
<TextBox Text="{Binding OutlinePlain, Mode=TwoWay, NotifyOnTargetUpdated=True}"
BorderThickness="0"
</TextBox>
</Border>
新しいテンプレートを使用する必要があります。
<Style TargetType="{x:Type TextBox}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="AllowDrop" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBoxBase}">
<Border
Name="Border"
CornerRadius="2"
Padding="2"
Background="#FFFFFF"
BorderBrush="#888888"
BorderThickness="1" >
<ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Border" Property="Background" Value="#EEEEEE"/>
<Setter TargetName="Border" Property="BorderBrush" Value="#EEEEEE"/>
<Setter Property="Foreground" Value="#888888"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
トリガーを削除しましたIsMouseOver
詳細については、こちらをご覧ください: TextBox Styles and Templates