2014-11-24 103 views
0

我使用下面的技術來實現水印(我是從代碼的附加屬性這樣做,但下面的XAML演示了問題):防止裁剪

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <DockPanel> 
     <TextBox DockPanel.Dock="Left" Name="txb"> 
      <TextBox.Background> 
       <VisualBrush Stretch="None"> 
        <VisualBrush.Visual> 
         <Border Background="White"> 
          <TextBlock Text="Hint text" Foreground="DarkGray" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Center" VerticalAlignment="Center"> 
           <TextBlock.Style> 
            <Style TargetType="TextBlock"> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding IsKeyboardFocusWithin, ElementName=txb}" Value="True"> 
               <Setter Property="Visibility" Value="Hidden" /> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </TextBlock.Style> 
          </TextBlock> 
         </Border> 
        </VisualBrush.Visual> 
       </VisualBrush> 
      </TextBox.Background> 
     </TextBox> 
     <Label Content="Label text here" /> 
    </DockPanel> 
</Window> 

然而,內一個DockPanel,第一個TextBox的寬度縮小到最小值,隱藏水印。

如何在計算TextBox的尺寸時強制WPF考慮背景的寬度?

我想我可以計算水印文本的預期寬度並適當地設置控件的MinWidth。但是,我寧願更簡單 - 一些屬性設置或數據綁定。

回答

1

我不知道有什麼辦法讓TextBox測量其所需的大小時自動考慮其背景畫筆。你可以,但是,明確其綁定到MinWidth水印的寬度:

<TextBox MinWidth="{Binding RelativeSource={RelativeSource Self}, 
          Path=Background.Visual.ActualWidth}" 
     ...> 

要強制有些微胖圍繞水印,設置在BorderPaddingVisualBrush.Visual

請注意,這是一個相當脆弱的綁定,如果後臺發生更改,可能會導致運行時異常。你可能想要重做它。

+0

這是爲什麼脆弱?因爲控件可能沒有'VisualBrush'作爲背景?但是在我寫的附屬屬性中,我已將背景設置爲「VisualBrush」,所以這不是問題。 – 2014-11-25 06:33:02

0

試試這個:

<Grid> 
    <TextBox Name="txb"> 
     ..... 
    <Label Content="Label text here" /> 
</Grid> 
+0

這並不能幫助我,因爲附加的屬性是在沒有任何周圍控件的知識的情況下在'TextBox'上設置的。 – 2014-11-25 06:29:41