5

WPF でデフォルトの TextBox の境界線をオーバーライドしたいと考えています。すべての TextBoxes に適用されるこのスタイルがあります。

<!-- StyleTextBox-->
<Style x:Key="StyleTextBox" TargetType="{x:Type TextBox}">
    <Setter Property="MinHeight" Value="20" />
    <Setter Property="HorizontalAlignment" Value="Left"/>
    <Setter Property="Margin" Value="3"/>
    <Setter Property="IsEnabled" Value="{DynamicResource WriteAble}"/>
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="VerticalContentAlignment" Value="Top" />
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="BorderBrush" Value="{StaticResource ButtonFont_DarkGray}" />
    <Style.Triggers>
        <!--Resolves multiline textbox vertical alignment problem-->
        <Trigger Property="TextWrapping" Value="NoWrap">
            <Setter Property="VerticalContentAlignment" Value="Center" />
        </Trigger>
    </Style.Triggers>
</Style> 

SnapsToDevicePixels="True"液晶モニターの枠線を正しく表示するように追記しました。

しかし、すべての TextBox は異なるようです。一部の境界線が欠落しているか、灰色です..理由を知っている人はいますか?

4

4 に答える 4

7

テキストボックスのテンプレートを編集して、境界線名Bdをクロムではなく「実際の」境界線に変更してみてください。このような:

<ControlTemplate x:Key="TextBoxBaseControlTemplate1" 
          TargetType="{x:Type TextBoxBase}">
  <Border x:Name="Bd" SnapsToDevicePixels="True" 
          Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}"
          BorderThickness="{TemplateBinding BorderThickness}" >
    <ScrollViewer x:Name="PART_ContentHost" 
              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
  </Border>
  <ControlTemplate.Triggers>
    <Trigger Property="IsEnabled" Value="False">
      <Setter Property="Background" TargetName="Bd" 
            Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
      <Setter Property="Foreground" 
           Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

このセッターをスタイルに追加して、テンプレートを有効にします。

<Setter Property="Template" 
        Value="{DynamicResource TextBoxBaseControlTemplate1}"/>  
于 2009-07-14T10:31:50.130 に答える
2

WPF は、UI をモニターにレンダリングするときにデバイスに依存しないようにしようとします。ユーザーが指示しない限り、"ピクセル パーフェクト" に描画することはありません。これをあなたのスタイルに追加してみてください:

<Setter Property="SnapsToDevicePixels" Value="True" />

これにより、WPF は 1 ピクセルの線に沿って各 1 ピクセルの太さの境界線をレンダリングするように指示されます。

于 2009-07-14T08:59:06.663 に答える
0

その問題を解決するには、次のことを行う必要があります...

  1. SnapsToDevicePixels="True"
  2. 幅を指定しないでください。余白で指定してください

    <Setter Property="BorderBrush" HorizontalAlignment="Left" Margin="2,2,2,2" Value="{StaticResource DarkGray}" />

お役に立てれば :)

于 2009-07-14T09:17:59.217 に答える
0

左の境界線と上の境界線はスタイル設定されていると思いますが、右と下の境界線はグレーのままですが、Style で BorderBrush=MyBrush と明示的に言いました。どう思いますか?TextBox から3D 効果を削除してみてはどうでしょうか。

于 2009-07-14T09:51:54.513 に答える