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