Как создать поле ввода в C # UWP, которые автоматически что-то делают? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь создать поле ввода (без кнопок), которое ожидает ввода от пользователя (обычно числа) и, когда длина равна 24, вызывает другую функцию для выполнения чего-либо.

Я уже создал один, но с помощью кнопки подтверждения: в mainpage.xaml.cs

public void WaitingInput()
    {
        string text = InputTextDialogAsync();
        DoSomething(text);
    }

private void InputTextDialogAsync()
    {
        TextBox inputTextBox = new TextBox();
        inputTextBox.AcceptsReturn = false;
        inputTextBox.Height = 32;
        inputTextBox.Width = 300;
        ContentDialog dialog = new ContentDialog();
        dialog.Content = inputTextBox;
        dialog.Title = "Input Reader";
        dialog.IsPrimaryButtonEnabled = true;
        dialog.IsSecondaryButtonEnabled = false;
        dialog.PrimaryButtonText = "Ok";
        if (await dialog.ShowAsync() == ContentDialogResult.Primary)
            return inputTextBox.Text;
        else
            return "";
    }

он создает то, что я хочу, но с помощью кнопки ОК для подтверждения.

public void DoSomething (string text) {
   if (text.length < 24) {
       WaitingInput();
       return;
   }
   // Do Something with text input ...

}

Я попытался с inputTextBox.TextChanging, но даже если входной текст удовлетворял требованиям (длина == 24), когда он заканчивает загрузку страницы, inputText появляется снова ...

Я что-то упускаю и, возможно, существует лучшее решение для этого.

---- ОБНОВЛЕНИЕ: Теперь я могу скрыть диалоговое окно contentdialog, но когда вы пытаетесь вставить этот текст ввода "123456789012345678901234", появляется сообщение о том, что я не могу открыть более одного диалогового окна содержимого, даже если я включил функцию Hide

MainPage.xaml.cs

namespace App1
{

public sealed partial class MainPage : Page
{
    ContentDialog dialogInput = new ContentDialog();
    TextBox inputBox = new TextBox();

    public MainPage()
    {
        this.InitializeComponent();
    }

    public void Page_Loaded(object sender, RoutedEventArgs e)
    {
        WaitingInput();
    }

    public async void WaitingInput()
    {
        inputBox.AcceptsReturn = false;
        inputBox.Height = 32;
        inputBox.Width = 300;
        inputBox.TextChanging += TextChangingHandler;
        dialogInput.Content = inputBox;
        dialogInput.Title = "Input Reader";
        dialogInput.IsPrimaryButtonEnabled = false;
        dialogInput.IsSecondaryButtonEnabled = false;
        dialogInput.PrimaryButtonText = "";
        await dialogInput.ShowAsync();
    }

    private void TextChangingHandler(TextBox sender, TextBoxTextChangingEventArgs e)
    {
        if (sender.Text.Length < 24)
        {
            return;
        }
        dialogInput.Hide();
        DoSomething(sender.Text);
    }


    private async void DoSomething(string inputTextUSER)
    {
        if (inputTextUSER == "123456789012345678901234")
        {
            WaitingInput();
            return;
        }
        inputText.Text = inputTextUSER;
        await Task.Delay(3000);
    }
}

}

MainPage.xaml

<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" Loaded="Page_Loaded"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Grid>
    <TextBox x:Name="inputText" Text="" HorizontalAlignment="Center" VerticalAlignment="Top" IsReadOnly="True" IsDoubleTapEnabled="False" IsHoldingEnabled="False" IsRightTapEnabled="False" IsTapEnabled="False" FontSize="24" FontWeight="Bold" RequestedTheme="Default" IsHitTestVisible="False" IsTabStop="False" IsTextPredictionEnabled="False" BorderThickness="0,0,0,2" BorderBrush="Black" Width="592" TextAlignment="Center" Foreground="Black" Background="Transparent" Height="45" Margin="0,50,0,0" />
</Grid>

1 Ответ

1 голос
/ 07 июня 2019

Я думаю, что OnTextChanging () - это путь, если я правильно понимаю ваши требования.

Вот некоторый код ... но понимаю, что, вероятно, есть другие сценарии, которые следует учитывать ... как насчет вставки данных, которые длиннее 24? проверка на входе? как закрыть окно, если нет кнопок и пользователь хочет отступить (esc работает, но это хороший дизайн)? и т. д. и т. д. Я также не вхожу в MVVM или другие подобные понятия. В этом коде также нет обработки исключений.

Вы должны быть в состоянии изменить по своему вкусу.

Управление вводом текста:

<ContentDialog
    x:Class="App1.InputTextDialog"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="TITLE">
    <Grid>
        <TextBox AcceptsReturn="False" Height="32" Width="300" TextChanging="OnTextChanging" />
    </Grid>
</ContentDialog>

код позади:

public sealed partial class InputTextDialog : ContentDialog
{
    public event EventHandler<EnteredTextArgs> OnValueEntered;
    public InputTextDialog()
    {
        this.InitializeComponent();
    }

    private void OnTextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
    {
        if (sender.Text.Length == 24)
        {
            OnValueEntered?.Invoke(this, new EnteredTextArgs() { EnteredText = sender.Text });
            sender.Text = string.Empty;
            this.Hide();
        }
    }
}

класс аргументов:

public class EnteredTextArgs : EventArgs
{
    public string EnteredText { get; set; }
}

главная страница:

<StackPanel>
    <Button Content="Show Dialog" Click="OnShowClick" />
    <TextBlock x:Name="txtblockResult" />
</StackPanel>

код главной страницы:

public sealed partial class MainPage : Page
{
    InputTextDialog dialog = new InputTextDialog();
    public MainPage()
    {
        this.InitializeComponent();
        Loaded += MainPage_Loaded;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        dialog.OnValueEntered += Dialog_OnValueEntered;
    }

    private void Dialog_OnValueEntered(object sender, EnteredTextArgs e)
    {
        txtblockResult.Text = e.EnteredText;
    }

    private async void OnShowClick(object sender, RoutedEventArgs e)
    {
        await dialog.ShowAsync();
    }
}

**** UPDATE **** ХОРОШО. Основываясь на вашем последнем обновлении, я думаю, что это то, что вы намеревались ... но, не зная полных требований, похоже, что нужно немного поработать. Удачи!

    public sealed partial class MainPage : Page
    {
        ContentDialog dialogInput = new ContentDialog();
        TextBox inputBox = new TextBox();

        public MainPage()
        {
            this.InitializeComponent();
            //you only want to call this once... not each time you show the dialog
            Setup();
            Loaded += Page_Loaded;
        }

        public void Page_Loaded(object sender, RoutedEventArgs e)
        {
           WaitingInput();
        }

        /// <summary>
        /// initializes the dialog and its child - the textbox
        /// </summary>
        private void Setup()
        {
            inputBox.AcceptsReturn = false;
            inputBox.Height = 32;
            inputBox.Width = 300;
            inputBox.TextChanging += TextChangingHandler;
            dialogInput.Content = inputBox;
            dialogInput.Title = "Input Reader";
            dialogInput.IsPrimaryButtonEnabled = false;
            dialogInput.IsSecondaryButtonEnabled = false;
            dialogInput.PrimaryButtonText = "";
        }

        private void ResetDialog()
        {
            inputBox.Text = string.Empty;
            WaitingInput();
        }

        public async void WaitingInput()
        {
            await dialogInput.ShowAsync();
        }

        private async void TextChangingHandler(TextBox sender, TextBoxTextChangingEventArgs e)
        {
            if (sender.Text.Length < 24)
            {
                return;
            }

            dialogInput.Hide();
            await DoSomething(sender.Text);
        }

        private async Task DoSomething(string inputTextUSER)
        {
            if (inputTextUSER == "123456789012345678901234")
            {
                //note: the dialog will not show again.  May as well close the app
                return;
            }
            //show inputted text in textblock
            inputText.Text = inputTextUSER;
            await Task.Delay(3000);
            //after 3 seconds, show the dialog again - unclear requirement
            ResetDialog();
        }

} 

MainPage.xaml:

<Grid>
    <TextBox x:Name="inputText" Text="" HorizontalAlignment="Center" VerticalAlignment="Top" IsReadOnly="True" IsDoubleTapEnabled="False" IsHoldingEnabled="False" IsRightTapEnabled="False" IsTapEnabled="False" FontSize="24" FontWeight="Bold" RequestedTheme="Default" IsHitTestVisible="False" IsTabStop="False" IsTextPredictionEnabled="False" BorderThickness="0,0,0,2" BorderBrush="Black" Width="592" TextAlignment="Center" Foreground="White" Background="Transparent" Height="45" Margin="0,50,0,0" />
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...