WPF TextBox水印效果制作方法詳解
一種自以為是的方式:
本來只是想簡單的做個水印效果,在文本框內(nèi)容為空的時候提示用戶輸入,這種需求挺常見。網(wǎng)上一搜 都是丟給你你一大段xaml代碼。用c#代碼實(shí)現(xiàn)我是不傾向了 既然用wpf就得Xaml啊。首先我想到的是template嘛 wpf到處離不開template 。我想到的是一個border 套一個textblock嘛 然后讓文本內(nèi)容通過templateBinding到Text嘛 搞得不亦樂乎 ,并且也確實(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">請輸入內(nèi)容22</TextBlock> </VisualBrush.Visual> </VisualBrush> </Setter.Value> </Setter> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> </TextBox.Template> </TextBox>
最后仔細(xì)一看杯具的發(fā)現(xiàn)文本內(nèi)容輸入的時候沒有光標(biāo),然后我想到的就是把模板里的textblock改為textbox就完了嘛。好 一改更杯具了 水印效果抽風(fēng)了 最后發(fā)現(xiàn) 用c#代碼 強(qiáng)制讓文本框Focus() 貌似就可以 ,也許本身元素就是TextBox 模板里面 再放TextBox 就會導(dǎo)致焦點(diǎn)無法獲取造成各種混亂吧。最后弄不好 。
通過嘗試更改TextBox自帶的模板來達(dá)到效果
導(dǎo)出系統(tǒng)默認(rèn)textBox的模板visualTree ,經(jīng)過嘗試成功達(dá)到效果,值得一提的是 我納悶兒網(wǎng)上那些人為甚有的一貼出的xaml代碼里面就是scrollviewer呢 并且還能夠正確運(yùn)行 讓我很難理解 ,一看原來系統(tǒng)默認(rèn)的就是scrollviewer 原來如此 還有Name=PART_ContentHost 只要寫成他自然而然就能被當(dāng)初內(nèi)容宿主處理??磥鞵ART_ContentHost 是個很特殊的系統(tǒng)名稱,還有就是多行文本框通過 設(shè)置AcceptsReturn="True" VerticalScrollBarVisibility="Auto" 屬性來達(dá)到:
<TextBox Text="" Height="60" Name="nihao" Width="300" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" > <TextBox.Template> <ControlTemplate TargetType="TextBox"> <!--下面必須寫成PART_ContentHost 才能正常 無語又是一個神秘硬編碼 我就納悶兒 為甚網(wǎng)上的人要寫 scrollviewer 而且自然而然的就成了宿主 讓文本顯示在里面 原來通過代碼導(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> <!--這里是無論何種手段都無法取得父元素 的寬度我無語 所以只能盡量把寬度 高度往大了寫 {Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=Width} --> <TextBlock Width="500" Height="100" Background="#FFE8DBDB">請輸入內(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á)到效果,只不過圓角border你必須要在text控件外再套border才能實(shí)現(xiàn):
<TextBox Text="" Height="30" BorderThickness="1" BorderBrush="Blue" Margin="10"> <TextBox.Style> <Style TargetType="TextBox"> <!--這種方式直接控制外圍的 background 也可以達(dá)到效果 ,只不過圓角邊框不能實(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 >請輸入內(nèi)容</TextBlock> </Border> </VisualBrush.Visual> </VisualBrush> </Setter.Value> </Setter> </MultiTrigger> </Style.Triggers> </Style> </TextBox.Style> </TextBox>
最終效果:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#解決多IfElse判斷語句和Switch語句問題的方法分享
這篇文章主要為大家介紹C#如何使用設(shè)計(jì)模式中的策略模式和委托來解決多個IfElse判斷語句和Switch語句,這種替換方式在其他語言也一樣可以做到,感興趣的可以了解一下2022-12-12Unity3D實(shí)現(xiàn)攝像機(jī)鏡頭移動并限制角度
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)攝像機(jī)鏡頭移動并限制角度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05C#將html table 導(dǎo)出成excel實(shí)例
C#將html table 導(dǎo)出成excel實(shí)例,需要的朋友可以參考一下2013-04-04聊聊C# 中HashTable與Dictionary的區(qū)別說明
這篇文章主要介紹了聊聊C# 中HashTable與Dictionary的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01DevExpress實(shí)現(xiàn)為TextEdit設(shè)置水印文字的方法
這篇文章主要介紹了DevExpress實(shí)現(xiàn)為TextEdit設(shè)置水印文字的方法,對C#程序設(shè)計(jì)人員來說是一個很實(shí)用的技巧,需要的朋友可以參考下2014-08-08