WPF TextBox水印效果制作方法詳解
一種自以為是的方式:
本來(lái)只是想簡(jiǎn)單的做個(gè)水印效果,在文本框內(nèi)容為空的時(shí)候提示用戶(hù)輸入,這種需求挺常見(jiàn)。網(wǎng)上一搜 都是丟給你你一大段xaml代碼。用c#代碼實(shí)現(xiàn)我是不傾向了 既然用wpf就得Xaml啊。首先我想到的是template嘛 wpf到處離不開(kāi)template 。我想到的是一個(gè)border 套一個(gè)textblock嘛 然后讓文本內(nèi)容通過(guò)templateBinding到Text嘛 搞得不亦樂(lè)乎 ,并且也確實(shí)很快就達(dá)到了我要的效果:
<TextBox>
<TextBox.Template>
<ControlTemplate TargetType="TextBox">
<Border BorderThickness="1" Name="border" BorderBrush="Red">
<TextBlock Text="{TemplateBinding Text}"></TextBlock>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Text" Value=""></Condition>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="border">
<Setter.Value>
<VisualBrush AlignmentX="Left" AlignmentY="Top" Stretch="None">
<VisualBrush.Visual>
<TextBlock Width="500" Height="100" Background="#FFE8DBDB">請(qǐng)輸入內(nèi)容22</TextBlock>
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</TextBox.Template>
</TextBox>
最后仔細(xì)一看杯具的發(fā)現(xiàn)文本內(nèi)容輸入的時(shí)候沒(méi)有光標(biāo),然后我想到的就是把模板里的textblock改為textbox就完了嘛。好 一改更杯具了 水印效果抽風(fēng)了 最后發(fā)現(xiàn) 用c#代碼 強(qiáng)制讓文本框Focus() 貌似就可以 ,也許本身元素就是TextBox 模板里面 再放TextBox 就會(huì)導(dǎo)致焦點(diǎn)無(wú)法獲取造成各種混亂吧。最后弄不好 。
通過(guò)嘗試更改TextBox自帶的模板來(lái)達(dá)到效果
導(dǎo)出系統(tǒng)默認(rèn)textBox的模板visualTree ,經(jīng)過(guò)嘗試成功達(dá)到效果,值得一提的是 我納悶兒網(wǎng)上那些人為甚有的一貼出的xaml代碼里面就是scrollviewer呢 并且還能夠正確運(yùn)行 讓我很難理解 ,一看原來(lái)系統(tǒng)默認(rèn)的就是scrollviewer 原來(lái)如此 還有Name=PART_ContentHost 只要寫(xiě)成他自然而然就能被當(dāng)初內(nèi)容宿主處理??磥?lái)PART_ContentHost 是個(gè)很特殊的系統(tǒng)名稱(chēng),還有就是多行文本框通過(guò) 設(shè)置AcceptsReturn="True" VerticalScrollBarVisibility="Auto" 屬性來(lái)達(dá)到:
<TextBox Text="" Height="60" Name="nihao" Width="300" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" >
<TextBox.Template>
<ControlTemplate TargetType="TextBox">
<!--下面必須寫(xiě)成PART_ContentHost 才能正常 無(wú)語(yǔ)又是一個(gè)神秘硬編碼
我就納悶兒 為甚網(wǎng)上的人要寫(xiě) scrollviewer 而且自然而然的就成了宿主 讓文本顯示在里面
原來(lái)通過(guò)代碼導(dǎo)出的默認(rèn)的visualtree就是這樣的。只有decorator 或scrollviewer元素可以用作PART_ContentHost
-->
<Border Name="borderContent" CornerRadius="10 0 0 10" BorderThickness="1" BorderBrush="Blue" Background="#FFE8DBDB" SnapsToDevicePixels="True">
<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" Name="PART_ContentHost" Focusable="False"/>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger >
<MultiTrigger.Conditions>
<Condition Property="IsFocused" Value="False"/>
<Condition Property="Text" Value=""/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="borderContent" >
<Setter.Value>
<VisualBrush AlignmentX="Left" AlignmentY="Top" Stretch="None">
<VisualBrush.Visual>
<!--這里是無(wú)論何種手段都無(wú)法取得父元素 的寬度我無(wú)語(yǔ) 所以只能盡量把寬度 高度往大了寫(xiě)
{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=Width}
-->
<TextBlock Width="500" Height="100" Background="#FFE8DBDB">請(qǐng)輸入內(nèi)容</TextBlock>
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
</MultiTrigger>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" TargetName="borderContent" Value="#FFE8DBDB"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</TextBox.Template>
</TextBox>
另一種方式:
還有一種方式就是直接控制外圍的style trigger也可達(dá)到效果,只不過(guò)圓角border你必須要在text控件外再套border才能實(shí)現(xiàn):
<TextBox Text="" Height="30" BorderThickness="1" BorderBrush="Blue" Margin="10">
<TextBox.Style>
<Style TargetType="TextBox">
<!--這種方式直接控制外圍的 background 也可以達(dá)到效果 ,只不過(guò)圓角邊框不能實(shí)現(xiàn)-->
<Setter Property="Background" Value="#FFE8DBDB"></Setter>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Text" Value="" ></Condition>
</MultiTrigger.Conditions>
<Setter Property="Background" >
<Setter.Value>
<VisualBrush AlignmentX="Left" AlignmentY="Top" Stretch="None" >
<VisualBrush.Visual >
<Border Background="#FFE8DBDB" Width="500" Height="100">
<TextBlock >請(qǐng)輸入內(nèi)容</TextBlock>
</Border>
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
</MultiTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
最終效果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)翻轉(zhuǎn)字符串的方法
這篇文章主要介紹了C#實(shí)現(xiàn)翻轉(zhuǎn)字符串的方法,涉及C#操作字符串的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
C#先判斷是否存在再創(chuàng)建文件夾或文件與遞歸計(jì)算文件夾大小
這篇文章介紹了C#先判斷是否存在再創(chuàng)建文件夾或文件與遞歸計(jì)算文件夾大小的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
C#實(shí)現(xiàn)無(wú)限級(jí)聯(lián)下拉列表框
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)無(wú)限級(jí)聯(lián)下拉列表框的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-03-03
c#基于WinForm的Socket實(shí)現(xiàn)簡(jiǎn)單的聊天室 IM
這篇文章主要介紹了c#基于WinForm的Socket實(shí)現(xiàn)簡(jiǎn)單的聊天室 IM的步驟,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-05-05

