防止背景水印的裁剪

时间:2014-11-24 18:43:50

标签: wpf

我正在使用以下技术来实现水印(我是通过附加属性中的代码执行此操作,但以下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。但是,我更喜欢更简单的东西 - 一些属性设置或数据绑定。

2 个答案:

答案 0 :(得分:1)

我不知道有什么方法可以让TextBox在测量所需尺寸时自动考虑背景画笔。但是,您可以将其MinWidth显式绑定到水印的宽度:

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

要强制在水印周围添加一些额外的填充,请在Padding内的Border上设置VisualBrush.Visual

请注意,这是一个相当脆弱的绑定,如果后台发生更改,可能会导致运行时异常。你可能想重做它。

答案 1 :(得分:0)

试试这个:

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