<Style TargetType="TextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<Border BorderBrush="Red" CornerRadius="2" />
<ScrollViewer x:Name="PART_ContentHost" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Label x:Name="watermarklabel" Height="40" Content="{TemplateBinding Tag}" Foreground="Gray"/>
</Grid>
<ControlTemplate.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Value="True">
<Condition.Binding>
<MultiBinding Converter="{StaticResource Multi}">
<!--<Binding Path="Text" ElementName="txt1"/>-->
<Binding RelativeSource="{RelativeSource Mode=TemplatedParent}" Path="Text"/>
</MultiBinding>
</Condition.Binding>
</Condition>
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" TargetName="watermarklabel" Value="Collapsed"/>
</MultiDataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这里我想在文本框文本为空且不为空的条件下启用/禁用标签(水印)。在多重绑定中,我试图使用TemplatedParent访问text属性。但是当文本改变时,它不会击中转换器。
当我使用元素名称访问它时,一切都很好。
但是我想把这个通用化......
如何使其发挥作用?
提前致谢..
答案 0 :(得分:1)
实际上令人惊讶地难以正确行事。互联网上有十几个不同的几乎正确的答案,但很少或没有完全正确的答案。
我最接近使其正常工作的方法是在运行时根据您正在评估的条件动态地将文本块注入标准文本框的ControlTemplate。
动态注入避免了必须重新实现整个控件模板,并且假设控件模板在版本之间不会进行太多转换,也避免了每次内置主题更改时必须创建新ControlTemplates的维护点
注入元素而不是修改现有文本元素可避免用户以不合需要的方式选择/操作水印文本的各种问题。
避免重叠解决方案:z顺序和裁剪问题不值得付出努力(我曾经尝试用装饰器做这件事,而不是正确的调用)
不要忘记验证文本框上的拖放和复制/粘贴操作是否按预期使用水印。
IIRC,我是用附属物做的,所以水印不需要新的控制。相反,它在视觉树中搜索了它可以找到的第一个可行的水印目标并在那里应用了水印。这也让它在组合框中工作,例如,没有添加工作。