【问题标题】:Water Mark Text Box水印文本框
【发布时间】:2014-07-10 22:17:33
【问题描述】:
<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 访问文本属性。但是当文本改变时,它没有点击转换器。

当我使用元素名称访问它时,一切都很好。

但我想把这个做成通用的..

如何让它发挥作用?

提前谢谢..

【问题讨论】:

标签: c# wpf


【解决方案1】:

这实际上令人惊讶地很难做到。互联网上有十几种几乎正确的答案,但很少或根本没有完全正确的答案。

我最接近让它正常工作的方法是在运行时根据您正在评估的条件将文本块动态注入标准文本框的 ControlTemplate 中。

  1. 动态注入避免了重新实现整个控件模板,并且假设控件模板不会在版本之间转换太多,还避免了每次内置主题更改时都必须创建新的 ControlTemplates 的维护点.

  2. 注入元素而不是修改现有文本元素可以避免用户以不希望的方式选择/操作水印文本的各种问题。

  3. 避免重叠解决方案:z 顺序和裁剪问题不值得付出努力(我曾经尝试使用装饰器来做到这一点,而不是正确的调用)

  4. 不要忘记验证文本框上的拖放和复制/粘贴操作是否与水印一样正常工作。

  5. IIRC,我使用附加属性进行操作,因此水印不需要新控件。相反,它在视觉树中搜索它可以找到的第一个可行的水印目标,并在那里应用水印。这让它也可以在组合框中工作,例如,无需添加工作。

【讨论】:

  • 嗨。谢谢你的回复。我通过使用附加属性(你的第 5 点)看到了这一点。我是这个 WPF 的新手。你能提供一个关于 1-4 点的示例吗??
  • 恐怕我已经没有代码了,所以手头没有样本。第 4 点只是普通的 UI 测试,没什么特别的。对于运行时模板修改,我建议使用 VisualTreeHelper (msdn.microsoft.com/en-us/library/…) 和 Snoop 将元素实际添加到模板并确定它应该在模板中的位置。
  • 好的。但我还有一个查询。在多重绑定中,我尝试使用“TemplatedParent”访问其父元素。但是这样做,转换器不会命中。不管我是对还是错。为什么它没有命中。当我使用元素名称时它很好。我该怎么做才能纠正这个问题??
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多