最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

接下來我們自定義一個控件 MultiLinePasswordBox 繼承 TextBox 輸入字符會以密碼字符(如默認的 )顯示。

私有字段如下:

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

依賴屬性如下:

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

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

  • 設(shè)置 TextWrapping = TextWrapping.Wrap; 支持多行顯示。
  • 設(shè)置 AcceptsReturn = true 支持按下 Enter 換行。
  • 訂閱 TextChanged 事件,文本更改時將輸入的文本轉(zhuǎn)換為密碼掩碼,如果 isUpdating 的標(biāo)志為 true ,則直接返回,避免重復(fù)更新文本。
  • 計算當(dāng)前輸入文本和上一次文本之間的長度差異,如果長度是正數(shù)則插入,反之長度差異是負數(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開發(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="請輸入授權(quán)碼" />
        </StackPanel>
    </Grid>
</wd:Window>

效果圖

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

相關(guān)文章

  • C#判斷文件夾是否存在,并執(zhí)行刪除、創(chuàng)建操作方式

    C#判斷文件夾是否存在,并執(zhí)行刪除、創(chuàng)建操作方式

    這篇文章主要介紹了C#判斷文件夾是否存在,并執(zhí)行刪除、創(chuàng)建操作方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • C# CultureInfo類案例詳解

    C# CultureInfo類案例詳解

    這篇文章主要介紹了C# CultureInfo類案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • WPF拖動DataGrid滾動條時內(nèi)容混亂的解決方法

    WPF拖動DataGrid滾動條時內(nèi)容混亂的解決方法

    這篇文章主要介紹了WPF拖動DataGrid滾動條時內(nèi)容混亂的解決方法
    2016-10-10
  • C#中ListView用法實例

    C#中ListView用法實例

    我們經(jīng)常會在應(yīng)用程序中使用列表的形式來展現(xiàn)一些內(nèi)容,所以學(xué)好ListView是非常必需的,下面這篇文章主要給大家介紹了關(guān)于C#中ListView用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 在Winform框架界面中改變并存儲界面皮膚樣式的方法

    在Winform框架界面中改變并存儲界面皮膚樣式的方法

    下面小編就為大家分享一篇在Winform框架界面中改變并存儲界面皮膚樣式的方法,具有很好的參考價值,希望對大家有所幫助
    2017-11-11
  • Unity3D手機陀螺儀的使用方法

    Unity3D手機陀螺儀的使用方法

    這篇文章主要為大家詳細介紹了Unity3D手機陀螺儀的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C#中partial關(guān)鍵字的作用

    C#中partial關(guān)鍵字的作用

    這篇文章主要介紹了C#中partial關(guān)鍵字的作用詳解,包括局部類型概念和注意點介紹,非常不錯,具有參考借鑒價值,需要的的朋友參考下
    2017-03-03
  • C#實現(xiàn)讀取txt通用的方法小結(jié)

    C#實現(xiàn)讀取txt通用的方法小結(jié)

    這篇文章主要為大家詳細介紹了C#讀取txt通用的方法,兼容所有的UTF-8、Unicode(Little Endian)、BigEndianUnicode,有需要的小伙伴可以了解下
    2024-01-01
  • C#實現(xiàn)閃動托盤圖標(biāo)效果的方法

    C#實現(xiàn)閃動托盤圖標(biāo)效果的方法

    這篇文章主要介紹了C#實現(xiàn)閃動托盤圖標(biāo)效果的方法,涉及C# ImageList控件的使用技巧,需要的朋友可以參考下
    2016-06-06
  • C#實現(xiàn)順序棧和鏈棧的代碼實例

    C#實現(xiàn)順序棧和鏈棧的代碼實例

    今天小編就為大家分享一篇關(guān)于的C#實現(xiàn)順序棧和鏈棧的代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10

最新評論

宜阳县| 昌乐县| 齐齐哈尔市| 漳浦县| 高邮市| 桂阳县| 蒙城县| 济南市| 抚州市| 双城市| 星子县| 武安市| 运城市| 比如县| 武定县| 贞丰县| 德令哈市| 石台县| 共和县| 兴业县| 平定县| 彰化县| 玉环县| 托里县| 南康市| 镇江市| 漳平市| 渝中区| 淮北市| 齐河县| 长宁县| 新乡县| 安陆市| 静海县| 永丰县| 凤冈县| 寿光市| 收藏| 咸阳市| 枣庄市| 扎囊县|