Как я могу вставить с помощью CTRL V в WPF, C#

#c# #wpf #xaml

Вопрос:

У меня есть проект C# WPF, у меня 4 ячейки, и я попытался вставить в эти ячейки некоторый код(например , PIN-код), но когда я нажал CTRL V, его первая цифра скопирована только в первую ячейку. Как я могу это решить?

.файл xaml

 <StackPanel Style="{DynamicResource HorizontalPanel}" >
                    <Menu>
                        <MenuItem Command="ApplicationCommands.Paste" />
                    </Menu>
                    <Border Style="{DynamicResource DigitBorder}">
                        <TextBox Style="{DynamicResource Digit1Text}" Name="Digit1" TextChanged="Digit1_TextChanged" />
                    </Border>
                    <Border Style="{DynamicResource DigitBorder}">
                        <TextBox Style="{DynamicResource Digit2Text}" Name="Digit2" TextChanged="Digit2_TextChanged"/>
                    </Border>
                    <Border Style="{DynamicResource DigitBorder}">
                        <TextBox Style="{DynamicResource Digit3Text}" Name="Digit3" TextChanged="Digit3_TextChanged"/>
                    </Border>
                    <Border Style="{DynamicResource DigitBorder}">
                        <TextBox Style="{DynamicResource Digit4Text}" Name="Digit4" TextChanged="Digit4_TextChanged"/>
                    </Border>
</StackPanel>
 

файл .xaml.cs:

 }

        public PasswordScreen(object object1, object object2, ConnectorAction connectorAction)
        {
            InitializeComponent();
            Digit1.Focus();            
            Object1 = object1;
            Object2 = object2;
            ConnectorAction = connectorAction;          
            MenuItem pasteMenuItem = new MenuItem();          
            pasteMenuItem.Command = ApplicationCommands.Paste;                      
        }

private void Digit1_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (Digit1.Text.Length == 1)
            {
                Digit2.Focus();
            }          
        }
 

то же самое для Digit2_TextChanged,Digit3_TextChanged,Digit4_TextChanged

Я не понимаю, как я улавливаю здесь пин — код и вставляю номера каждого номера на разные ячейки? подчеркнутый текст

Ответ №1:

Если я правильно понял, вы хотите вставить 4-значный pin-код и каждую цифру в одно текстовое поле.

Одним из способов может быть обработка его в измененном тексте текстового поля (пример для первого текстового поля, для других изменений текстового поля, необходимых, если все текстовые поля должны поддерживать разделение).:

 private void Digit1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (Digit1.Text.Length <= 1)
            return;
        
        string text = Digit1.Text;
        Digit2.Text = text[1].ToString();
        if (text.Length > 2)
            Digit3.Text = text[2].ToString();
        if (text.Length > 3)
            Digit4.Text = text[3].ToString();

        Digit1.Text = text[0].ToString();
    }
 

Или напишите собственную команду для вставки, которую можно вызвать нажатием кнопки или ярлыком:

 private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        if (!Clipboard.ContainsText())
            return;

        string clipboardText = Clipboard.GetText();

        if (string.IsNullOrEmpty(clipboardText))
            return;

        int length = clipboardText.Length;
        if (length > 0)
            Digit1.Text = clipboardText[0].ToString();
        if (length > 1)
            Digit2.Text = clipboardText[1].ToString();
        if (length > 2)
            Digit3.Text = clipboardText[2].ToString();
        if (length > 3)
            Digit4.Text = clipboardText[3].ToString();
    }
 

Комментарии:

1. Как menuitem_click обрабатывает Ctrl V ?

2. @Andy как я уже упоминал выше, это предназначалось для использования с нажатием кнопки также в качестве возможности. Событие textbox должно разделить текст, если он больше 1 символа.