2014-11-24 106 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