欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門教程網(wǎng)!

C#教程

當(dāng)前位置:主頁(yè) > 軟件編程 > C#教程 >

WPF TextBox水印效果制作方法詳解

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C#教程|點(diǎn)擊: 次

一種自以為是的方式:

本來(lái)只是想簡(jiǎn)單的做個(gè)水印效果,在文本框內(nèi)容為空的時(shí)候提示用戶輸入,這種需求挺常見。網(wǎng)上一搜 都是丟給你你一大段xaml代碼。用c#代碼實(shí)現(xiàn)我是不傾向了 既然用wpf就得Xaml啊。首先我想到的是template嘛 wpf到處離不開template 。我想到的是一個(gè)border 套一個(gè)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">請(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í)候沒有光標(biāo),然后我想到的就是把模板里的textblock改為textbox就完了嘛。好 一改更杯具了 水印效果抽風(fēng)了 最后發(fā)現(xiàn) 用c#代碼 強(qiáng)制讓文本框Focus() 貌似就可以 ,也許本身元素就是TextBox 模板里面 再放TextBox 就會(huì)導(dǎo)致焦點(diǎn)無(wú)法獲取造成各種混亂吧。最后弄不好 。

通過嘗試更改TextBox自帶的模板來(lái)達(dá)到效果

導(dǎo)出系統(tǒng)默認(rèn)textBox的模板visualTree ,經(jīng)過嘗試成功達(dá)到效果,值得一提的是 我納悶兒網(wǎng)上那些人為甚有的一貼出的xaml代碼里面就是scrollviewer呢 并且還能夠正確運(yùn)行 讓我很難理解 ,一看原來(lái)系統(tǒng)默認(rèn)的就是scrollviewer 原來(lái)如此 還有Name=PART_ContentHost  只要寫成他自然而然就能被當(dāng)初內(nèi)容宿主處理。看來(lái)PART_ContentHost  是個(gè)很特殊的系統(tǒng)名稱,還有就是多行文本框通過 設(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">
      <!--下面必須寫成PART_ContentHost 才能正常 無(wú)語(yǔ)又是一個(gè)神秘硬編碼 
            我就納悶兒 為甚網(wǎng)上的人要寫 scrollviewer 而且自然而然的就成了宿主 讓文本顯示在里面
            原來(lái)通過代碼導(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ǔ) 所以只能盡量把寬度 高度往大了寫
                        {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á)到效果,只不過圓角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 >請(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í)有所幫助,也希望大家多多支持我們。

上一篇:C# WPF ListView控件的實(shí)例詳解

欄    目:C#教程

下一篇:C#中foreach實(shí)現(xiàn)原理詳解

本文標(biāo)題:WPF TextBox水印效果制作方法詳解

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5477.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有