查找资源时多用element.TryFindResource()


        <TextBox FontSize="17" Height="26" Margin="230,150,189,0" Name="txt_Account" VerticalAlignment="Top" Foreground="Indigo" TabIndex="0" BorderThickness="1">            <TextBox.Resources>                <VisualBrush x:Key="HelpBrush" TileMode="None" Opacity="0.3" Stretch="None" AlignmentX="Left">                    <VisualBrush.Visual>                        <TextBlock FontStyle="Italic" Text="请输入用户名"/>                    </VisualBrush.Visual>                </VisualBrush>            </TextBox.Resources>            <TextBox.Style>                <Style TargetType="TextBox">                    <Style.Triggers>                        <Trigger Property="Text" Value="{x:Null}">                            <Setter Property="Background" Value="{StaticResource HelpBrush}"/>                        </Trigger>                        <Trigger Property="Text" Value="">                            <Setter Property="Background" Value="{StaticResource HelpBrush}"/>                        </Trigger>                    </Style.Triggers>                </Style>            </TextBox.Style>        </TextBox>

在传统的WinForm中这种文本框提示水印通常直接在控件的事件中实现。但是在WPF的设计理念中,这种和View强相关的内容不应该暴露在相关的逻辑代码中;而WPF也确实提供了类似的机制达成目的。

对于普通的文本框

因为TextBox的Text属性是一个dependency property,所以直接利用WPF的Data Trigger即可做到

YAML

<TextBox  Width="250"  VerticalAlignment="Center" HorizontalAlignment="Left" x:Name="SearchTermTextBox" Margin="5"/>
<TextBlock IsHitTestVisible="False" Text="Enter Search Term Here" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0" Foreground="DarkGray">
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Text, ElementName=SearchTermTextBox}" Value="">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

效果大概如图所示

对于PasswordBox

因为PasswordBox的Password属性不是dependency property,不能附加上data trigger,所以事情瞬间变得困难得多。

一个靠谱的做法是自己提供了一个类,通过attach dependency property得方式为PasswordBox挂接一个用来显示watermark text的属性,然后再利用XAML template为这个属性设置相应的data trigger。

这种方式虽然也要自己写大量的stub code,但是好处在于,这些代码和具体控件完全是分离的;并且这个由我们提供的属性可以和内建属性一样,直接通过XAML,在运行前就绑定好,不需要我们往控件的逻辑中做任何修改。

方法分三步,分别是

  1. 提供dependency property的代码
  2. 在XAML的resource dictionary中提供我们的template,这部分包含实现事件切换的data trigger
  3. 在控件设计的XAML中进行绑定

代码部分请参考 这里

效果大概如下

这个图上看起来很酷炫的淡出淡入也是直接有template的animation完成…

GIF图这里动不起来了……

方法1来自StackOverflow上的 这个回答

方法2来自 此处 ,我对watermarktext.cs做了修改,让这部分代码看起来更自然一些,顺带提高了代码的优雅度。XAML部分是直接复制粘贴的的,这部分完全摊手。

在此对他们表示感谢。

wpf提示背景,资源样式的更多相关文章

  1. WPF XAML 资源样式模板属性存放位置

    WPF的XAML 资源申明 类似HTML. 整体来说分3种1.行类资源样式属性 1.1 行内属性 <Button Content="按钮" Foreground=" ...

  2. WPF学习之资源-Resources

    WPF学习之资源-Resources WPF通过资源来保存一些可以被重复利用的样式,对象定义以及一些传统的资源如二进制数据,图片等等,而在其支持上也更能体现出这些资源定义的优越性.比如通过Resour ...

  3. WPF中的资源简介、DynamicResource与StaticResource的区别(转)

    什么叫WPF的资源(Resource)?资源是保存在可执行文件中的一种不可执行数据.在WPF的资源中,几乎可以包含图像.字符串等所有的任意CLR对象,只要对象有一个默认的构造函数和独立的属性. 也就是 ...

  4. WPF笔记(1.9 样式和控件模板)——Hello,WPF!

    原文:WPF笔记(1.9 样式和控件模板)--Hello,WPF! 资源的另一个用途是样式设置: <Window >  <Window.Resources>    <St ...

  5. ArcGIS for WPF 访问外部资源

    原文 http://www.cnblogs.com/wdysunflower/archive/2011/07/14/2105584.html ArcGIS for WPF 访问外部资源 应用背景: 因 ...

  6. 样式(Style)和主题(Theme)资源——样式资源

    样式和主题资源都是用于对Android应用进行“美化”的,只要充分利用Android应用的样式和主题资源,开发者可以开发出各种风格的Android应用. 样式资源:         如果我们经常需要对 ...

  7. 《深入浅出WPF》笔记——资源篇

    原文:<深入浅出WPF>笔记--资源篇 前面的记录有的地方已经用到了资源,本文就来详细的记录一下WPF中的资源.我们平时的“资源”一词是指“资财之源”,是创造人类社会财富的源泉.在计算机程 ...

  8. WPF中的资源简介、DynamicResource与StaticResource的区别

    原文:WPF中的资源简介.DynamicResource与StaticResource的区别 什么叫WPF的资源(Resource)?资源是保存在可执行文件中的一种不可执行数据.在WPF的资源中,几乎 ...

  9. WPF ScrollViewer(滚动条) 自定义样式表制作 再发一套样式 细节优化

    艾尼路 出的效果图 本人嵌套 WPF ScrollViewer(滚动条) 自定义样式表制作 图文并茂 WPF ScrollViewer(滚动条) 自定义样式表制作 (改良+美化) 源代码

随机推荐

  1. C++ 利用socket实现TCP,UDP网络通讯

    学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...

  2. UI设计师的 Android 备忘录

    Images and themes Nine-patch Colors Holo themes Naming conventions Naming conventions for drawables ...

  3. lc面试准备:Implement Stack using Queues

    1 题目 Implement the following operations of a stack using queues. push(x) -- Push element x onto stac ...

  4. Delphi中代替WebBrowser控件的第三方控件

    这几天,接触到在delphi中内嵌网页,用delphi7自带的TWebBrowser控件,显示的内容与本机IE8显示的不一样,但是跟装IE8之前的IE6显示一个效果.现在赶脚是下面两个原因中的一个: ...

  5. NOT EXISTS优化

    INSERT INTO F_PTY_INDIV (PTY_ID, PTY_NAME, GENDER_CD, BIRTHDAY, CERT_TYPE, CERT_NO, SOCINSUR_NO, COU ...

  6. mysql中的timestamp类型时间比较:unix_timestamp函数

    在mysql中,某字段的类型设置为了timestamp,那么我们现在希望取出指定时间段的记录,该如何做呢? 在php中有time()和strtotime()来进行日期和时间戳的格式化,而在mysql中 ...

  7. 【转】Ubuntu下搭建SVN环境-Apache

    原文网址:http://www.cnblogs.com/candle806/archive/2012/12/20/2826280.html 环境描述:ubuntu server 12.04  / sv ...

  8. Move Zeroes——Leetcode

    Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...

  9. Android学习笔记(三)Application类简介

    每次运行APP时,Application类都保持实例化状态.与Activity不同,配置改变不会导致应用程序重启.通过继承Application类,可以完成一下3项工作: · 对Android运行时广 ...

  10. [转]Ubuntu上的包管理:dpkg,apt和aptitude

    一直以来对于ubuntu的包管理的概念就是apt-get,偶尔手动装个包就是dpkg -i,现在觉得是要系统地了解一下这几个包管理的命令. 原文转自: http://zhouliang.pro/201 ...