WPF實現placeholder效果

来源:https://www.cnblogs.com/hanbing81868164/p/18103345
-Advertisement-
Play Games

概述:WPF中通過`Style`實現TextBox水印文本,使用`WatermarkTextBox`類及`ControlTemplate`。這個示例通過`VisualStateManager`在文本框失去焦點且內容為空時顯示水印文本。通過`Watermark`屬性簡化水印文本設置,提高可維護性。 在 ...


 

概述:WPF中通過`Style`實現TextBox水印文本,使用`WatermarkTextBox`類及`ControlTemplate`。這個示例通過`VisualStateManager`在文本框失去焦點且內容為空時顯示水印文本。通過`Watermark`屬性簡化水印文本設置,提高可維護性。

在WPF中,通過Style實現TextBox中的水印文本(水印、提示、占位符文本)通常使用ControlTemplateVisualStateManager。以下是一個詳細的實例源代碼:

using System.Windows;
using System.Windows.Controls;

namespace WpfWatermarkExample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class WatermarkTextBox : TextBox
    {
        public static readonly DependencyProperty WatermarkProperty =
            DependencyProperty.Register("Watermark", typeof(string), typeof(WatermarkTextBox));

        public string Watermark
        {
            get { return (string)GetValue(WatermarkProperty); }
            set { SetValue(WatermarkProperty, value); }
        }

        static WatermarkTextBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(WatermarkTextBox), new FrameworkPropertyMetadata(typeof(WatermarkTextBox)));
        }
    }
}

XAML文件:

<Window x:Class="WpfWatermarkExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:WatermarkTextBox Watermark="請輸入內容" Width="200" Height="30"/>
    </Grid>
</Window>

Themes/Generic.xaml文件:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WpfWatermarkExample">

    <Style TargetType="{x:Type local:WatermarkTextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:WatermarkTextBox}">
                    <Grid>
                        <TextBox x:Name="PART_TextBox"
                                 Text="{TemplateBinding Text}"
                                 VerticalAlignment="Center"
                                 HorizontalAlignment="Stretch"/>

                        <TextBlock x:Name="PART_Watermark"
                                   Text="{TemplateBinding Watermark}"
                                   Foreground="Gray"
                                   VerticalAlignment="Center"
                                   HorizontalAlignment="Left"
                                   Visibility="Collapsed"/>

                    </Grid>

                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsFocused" Value="False"/>
                                <Condition Property="Text" Value=""/>
                            </MultiTrigger.Conditions>
                            <Setter TargetName="PART_Watermark" Property="Visibility" Value="Visible"/>
                        </MultiTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

看效果:

 

這個例子中,自定義了WatermarkTextBox類,其中包含一個Watermark屬性。在Themes/Generic.xaml中,定義了WatermarkTextBoxControlTemplate,通過VisualStateManager在未獲得焦點且文本為空時顯示水印文本。在MainWindow.xaml中使用了WatermarkTextBox並設置了水印文本。

源代碼獲取:https://pan.baidu.com/s/1YCuKZhEOrs-C3nGqjNB-lA?pwd=6666 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先看完成效果 一個玩家的效果 多個玩家的效果 源碼地址 https://gitee.com/chesterdotchen/snake-with-orleans 項目介紹 Snake.Common項目 IGameGrain:游戲的Grain定義,與State定義 ISnakeGrain:蛇的Grai ...
  • 本章將和大家分享 Elasticsearch 中的數據聚合功能,通過聚合(aggregations)可以實現對文檔數據的統計、分析、運算。 ...
  • 工具類擴展 1. ILSpy 2022 (免費) ILSpy 是 ILSpy 開源反編譯器的 Visual Studio 擴展。 是一款開源、免費的、且適用於.NET平臺反編譯【C#語言編寫的程式和庫(.dll)內容】工具;可以集成在Visual Studio 開發工具中,能夠十分快捷方便的查看源代 ...
  • 前言 WPF中Window相信大家都很熟悉,有時我們有一些自定義需求預設Window是無法滿足的,比如在標題欄上放一些自己東西,這個時候我們就需要寫一個自己的Window,實現起來也很簡單,只要給Window設置一個WindowChrome.WindowChrome附加屬性就可以實現,WindowC ...
  • 前言 上文介紹瞭如何通過一個Form自定義控制項來簡化數據的錄入,並自動實現數據校驗,自動佈局排列等功能。本文繼續介紹如何優化表格控制項的使用,縮減代碼量,實現工作效率的提升。 一、功能實現 上文中分析了DataGrid跟ListView兩種表格控制項的優劣,在這裡我們選擇ListView來實現我們的表格 ...
  • gRPC是一個現代的開源高性能遠程過程調用(RPC)框架,它可以高效地連接數據中心內和跨數據中心的服務,支持負載平衡、跟蹤、運行狀況檢查和身份驗證。 gRPC通過使用 Protocol Buffers 作為數據傳輸格式,實現了在不同平臺上的通信,並支持雙向流和流式傳輸。RPC 是遠程過程調用的縮寫, ...
  • 到目前為止,Orleans7的核心概念基本已經學完,我準備使用Orleans7做一個項目實戰,來總結自己的學習效果。 項目效果 通過Orleans7來完成一個貪吃蛇游戲,要求如下: 可以多人線上玩 貪吃蛇可以上/下/左/右改方向 貪吃蛇吃完食物,身體長度+1 項目暫定架構 初步設想,此游戲包括一個O ...
  • 概念 在Orleans中,Streaming是一組API和功能集,它提供了一種構建、發佈和消費數據流的方式。 這些流可以是任何類型的數據,從簡單的消息到複雜的事件或數據記錄。Streaming API允許你定義、發佈和消費這些流,而無需關心底層的傳輸機制或數據存儲。 每個流都有一個唯一的標識符,稱為 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...