2009-07-14 49 views
4

我想覆蓋WPF中的默認TextBox邊框。我有這種適用於所有文本框的樣式。WPF TextBox難看的邊框問題

<!-- 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看起來都不一樣。有些邊界缺失,或灰色.. 有誰知道爲什麼?

+0

我不能重現XamlPad效果。你能更具體地瞭解它嗎?就像顯示其餘的標記一樣;並且截圖也可能有幫助。 – 2009-07-14 08:10:34

+0

我添加了一個截圖。 – 2009-07-14 08:53:50

+0

看起來不錯,只是donn指定寬度屬性文本框... – 2009-07-14 09:34:27

回答

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添加到您的風格,使模板:

<Setter Property="Template" 
     Value="{DynamicResource TextBoxBaseControlTemplate1}"/> 
2

當向顯示器渲染UI時,WPF嘗試與設備無關,除非您告訴它,否則不會繪製「像素完美」的東西。嘗試添加到您的風格:

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

這應該告訴WPF沿單個像素線呈現每個1像素厚的邊界。

+0

我試過沒有成功:-(那些文本框被放置在一個網格中,可能是一個問題?但對於大多數文本框我設置寬度=「自動」或寬度=「*」..所以我沒有看到隱藏點 – 2009-07-14 09:16:31

+0

嗯,在網格中放置文本框應該不是問題,你可以用完整的樣式定義來更新你的問題嗎? – 2009-07-14 09:18:30

0

你需要做以下內容來解決這個問題......

  1. SnapsToDevicePixels="True"
  2. 不要指定寬度,隨着利潤率

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

希望這會做到這一點幫助:)

0

我認爲左邊框和上邊框是樣式的,但是右邊框和邊框邊框保持灰色,儘管我在Style中明確指出BorderBrush = MyBrush。 你覺得呢?怎麼樣從TextBox中刪除3D效果