亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

WPF實(shí)現(xiàn)授權(quán)碼顯示密文并支持換行

 更新時(shí)間:2024年10月22日 15:19:37   作者:WPF開(kāi)發(fā)者  
這篇文章主要為大家詳細(xì)介紹了如何使用WPF實(shí)現(xiàn)授權(quán)碼顯示密文并支持換行,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下

WPF 授權(quán)碼顯示密文并支持換行

  • 框架使用.NET8;
  • Visual Studio 2022;

有開(kāi)發(fā)者需要制作一個(gè)授權(quán)碼輸入框輸入內(nèi)容后顯示密文并且能 Enter 進(jìn)行換行輸入。由于無(wú)法使用 PasswordBox 控件本身不支持換行,因?yàn)樗O(shè)計(jì)為單行輸入控件。

所以最簡(jiǎn)單的方法是使用 TextBox 并通過(guò)自定義邏輯代碼來(lái)掩蓋輸入的文本。這樣可以實(shí)現(xiàn)多行輸入,處理文本顯示和密碼掩碼的邏輯。

接下來(lái)我們自定義一個(gè)控件 MultiLinePasswordBox 繼承 TextBox 輸入字符會(huì)以密碼字符(如默認(rèn)的 )顯示。

私有字段如下:

  • passwordBuilder 用于存儲(chǔ)密碼。
  • previousText 用于存放上一次的文本。
  • isUpdating 用于記錄是否正在編輯。

依賴屬性如下:

  • PasswordChar:用于顯示密碼字符的字符,如果未顯示則默認(rèn)為。
  • PlainText:控件中原始的未掩蓋的文本。

構(gòu)造函數(shù):

  • 設(shè)置 TextWrapping = TextWrapping.Wrap; 支持多行顯示。
  • 設(shè)置 AcceptsReturn = true 支持按下 Enter 換行。
  • 訂閱 TextChanged 事件,文本更改時(shí)將輸入的文本轉(zhuǎn)換為密碼掩碼,如果 isUpdating 的標(biāo)志為 true ,則直接返回,避免重復(fù)更新文本。
  • 計(jì)算當(dāng)前輸入文本和上一次文本之間的長(zhǎng)度差異,如果長(zhǎng)度是正數(shù)則插入,反之長(zhǎng)度差異是負(fù)數(shù)則刪除。
  • 調(diào)用 CreateMaskedTextWithLineBreaks 方法創(chuàng)建帶有掩碼和換行符的文本。
  • 更新控件的文本,保持光標(biāo)位置不變,并更新PlainText。

1)MultiLinePasswordBox.cs 代碼如下:

using System;
using System.Diagnostics;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace WpfTextOrPasswordBox
{
    public class MultiLinePasswordBox : TextBox
    {
        private StringBuilder passwordBuilder = new StringBuilder();
        private string previousText = string.Empty;
        private bool isUpdating = false;

        public char PasswordChar
        {
            get { return (char)GetValue(PasswordCharProperty); }
            set { SetValue(PasswordCharProperty, value); }
        }

        public static readonly DependencyProperty PasswordCharProperty =
            DependencyProperty.Register("PasswordChar", typeof(char), typeof(MultiLinePasswordBox), new PropertyMetadata('●'));


        public string PlainText
        {
            get { return (string)GetValue(PlainTextProperty); }
            set { SetValue(PlainTextProperty, value); }
        }

        public static readonly DependencyProperty PlainTextProperty =
            DependencyProperty.Register("PlainText", typeof(string), typeof(MultiLinePasswordBox), new PropertyMetadata(string.Empty));


        public MultiLinePasswordBox()
        {
            AcceptsReturn = true;
            TextWrapping = TextWrapping.Wrap;
            VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
            TextChanged += PasswordTextBox_TextChanged;
        }

        private void PasswordTextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (isUpdating)
                return;

            isUpdating = true;
            var caretIndex = CaretIndex;
            var input = Text;
            if (string.IsNullOrWhiteSpace(Text))
            {
                passwordBuilder.Clear();
            }
            else
            {
                var s = passwordBuilder.Length;
                int lengthDifference = input.Length - previousText.Length;
                if (lengthDifference > 0)
                {
                    var newText = input.Substring(caretIndex - lengthDifference, lengthDifference);
                    passwordBuilder.Insert(caretIndex - lengthDifference, newText);
                }
                else if (lengthDifference < 0)
                {
                    passwordBuilder.Remove(caretIndex, Math.Abs(lengthDifference));
                    if (passwordBuilder[caretIndex - 1].ToString() != input)
                    {
                        var index = passwordBuilder.ToString().IndexOf(passwordBuilder[caretIndex - 1]);
                        passwordBuilder.Replace(passwordBuilder[caretIndex - 1], input.Last());
                    }
                }
                var maskedText = CreateMaskedTextWithLineBreaks(passwordBuilder.ToString());
                TextChanged -= PasswordTextBox_TextChanged;
                Text = maskedText;
                TextChanged += PasswordTextBox_TextChanged;
            }
            previousText = Text;
            CaretIndex = caretIndex;
            PlainText = passwordBuilder.ToString();
            isUpdating = false;
        }

        private string CreateMaskedTextWithLineBreaks(string text)
        {
            var maskedText = new StringBuilder();
            foreach (char c in text)
            {
                if (c == '\r' || c == '\n')
                    maskedText.Append(c);
                else
                    maskedText.Append(PasswordChar.ToString());
            }
            return maskedText.ToString();
        }
    }
}

2)MultiLinePasswordBoxSample.xaml 代碼如下:

<wd:Window
    x:Class="WpfTextOrPasswordBox.MultiLinePasswordBoxSample"
    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:local="clr-namespace:WpfTextOrPasswordBox"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:wd="https://github.com/WPFDevelopersOrg/WPFDevelopers"
    Title="MultiLinePasswordBoxSample - WPF開(kāi)發(fā)者"
    Width="800"
    Height="450"
    WindowStartupLocation="CenterScreen"
    mc:Ignorable="d">
    <Grid>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
            <TextBlock Margin="0,20">
                <Run Text="明文:" />
                <Run Text="{Binding ElementName=myMultiLinePasswordBox, Path=PlainText}" />
            </TextBlock>
            <local:MultiLinePasswordBox
                x:Name="myMultiLinePasswordBox"
                Width="200"
                Height="60"
                wd:ElementHelper.CornerRadius="3"
                wd:ElementHelper.Watermark="請(qǐng)輸入授權(quán)碼" />
        </StackPanel>
    </Grid>
</wd:Window>

效果圖

到此這篇關(guān)于WPF實(shí)現(xiàn)授權(quán)碼顯示密文并支持換行的文章就介紹到這了,更多相關(guān)WPF授權(quán)碼顯示密文內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Deflate算法對(duì)文件進(jìn)行壓縮與解壓縮的方法詳解

    使用Deflate算法對(duì)文件進(jìn)行壓縮與解壓縮的方法詳解

    本篇文章是對(duì)使用Deflate算法對(duì)文件進(jìn)行壓縮和解壓縮的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C#中的Image控件用法詳解與實(shí)際應(yīng)用示例

    C#中的Image控件用法詳解與實(shí)際應(yīng)用示例

    在C#應(yīng)用程序開(kāi)發(fā)中,圖像顯示是一個(gè)常見(jiàn)的需求,無(wú)論是創(chuàng)建圖形界面還是處理圖像數(shù)據(jù),System.Windows.Controls.Image控件都是實(shí)現(xiàn)這一目標(biāo)的重要工具,本文將詳細(xì)介紹Image控件的功能、用法、優(yōu)化技巧以及一些實(shí)際應(yīng)用示例,需要的朋友可以參考下
    2024-06-06
  • c#數(shù)據(jù)庫(kù)與TXT導(dǎo)入導(dǎo)出的實(shí)例

    c#數(shù)據(jù)庫(kù)與TXT導(dǎo)入導(dǎo)出的實(shí)例

    最近剛學(xué)完ADO.NET,做了個(gè)數(shù)據(jù)導(dǎo)入導(dǎo)出的題目,是將txt中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù),然后將數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出到txt中,這里說(shuō)的數(shù)據(jù)的格式是“tom|23”,tom指名字,23指年齡。廢話也不多說(shuō)了,大家直接看代碼。
    2013-04-04
  • C#在 .NET中使用依賴注入的示例詳解

    C#在 .NET中使用依賴注入的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何在 .NET中使用依賴注入,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2024-01-01
  • C#數(shù)組應(yīng)用分析

    C#數(shù)組應(yīng)用分析

    C#數(shù)組應(yīng)用分析...
    2007-08-08
  • C# 使用multipart form-data方式post數(shù)據(jù)到服務(wù)器

    C# 使用multipart form-data方式post數(shù)據(jù)到服務(wù)器

    這篇文章主要介紹了C# 使用multipart form-data方式post數(shù)據(jù)到服務(wù)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • WPF實(shí)現(xiàn)獲取攝像頭幀圖的代碼示例

    WPF實(shí)現(xiàn)獲取攝像頭幀圖的代碼示例

    這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)獲取攝像頭幀圖的代碼示例,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的可以參考一下
    2024-02-02
  • C#圖像透明度調(diào)整的方法

    C#圖像透明度調(diào)整的方法

    這篇文章主要介紹了C#圖像透明度調(diào)整的方法,涉及C#操作圖像透明度的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • 如何在Unity中檢測(cè)死循環(huán)和卡死

    如何在Unity中檢測(cè)死循環(huán)和卡死

    這篇文章主要介紹了在Unity中檢測(cè)死循環(huán)和卡死的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Unity實(shí)現(xiàn)老虎機(jī)滾動(dòng)抽獎(jiǎng)效果的示例代碼

    Unity實(shí)現(xiàn)老虎機(jī)滾動(dòng)抽獎(jiǎng)效果的示例代碼

    這篇文章主要介紹了Unity實(shí)現(xiàn)老虎機(jī)滾動(dòng)抽獎(jiǎng)效果的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論