Я думаю, что 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>