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

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)文章

最新評(píng)論

大新县| 章丘市| 丰城市| 开鲁县| 古田县| 丘北县| 米林县| 鲁甸县| 瓮安县| 曲松县| 库尔勒市| 白沙| 丹东市| 陈巴尔虎旗| 苍溪县| 咸宁市| 聊城市| 延吉市| 修水县| 溧阳市| 灵石县| 广宗县| 泽普县| 汝城县| 瑞丽市| 江永县| 黄平县| 合川市| 郁南县| 新晃| 贺兰县| 滦平县| 浠水县| 东明县| 怀化市| 砚山县| 贵阳市| 武义县| 阳西县| 韶山市| 香格里拉县|