UWP ждать, пока не сработает событие Textbox. - PullRequest
0 голосов
/ 17 января 2019

Как изменить текст в текстовом поле UWP и дождаться его завершения TextChanged, прежде чем двигаться дальше, или не запускать событие TextChanged вообще.

Сценарий. Основной пользовательский интерфейс показывает красный флаг, если текст TextBox изменяется - однако мне нужно время от времени сбрасывать его (TextBox.Text = "" или какой-то другой текст), когда это происходит, я хочу, чтобы мой красный флаг становился зеленым.

Ожидаемый поток процесса

TextBox.Text = ""
TextBox.Changed event fires - causing my flag to go red
Reset flag to green

Фактический поток процесса

TextBox.Text = ""
Reset flag to green
TextBox.Changed event fires - causing my flag to go red

Что я думаю, что происходит Установка TextBox.Text приводит к добавлению события в очередь отправки, которое не запускается, пока поток пользовательского интерфейса не находится в режиме ожидания, это означает, что следующая команда (сбросить флажок на зеленый) происходит до того, как событие TextChanged будет использовано. Также возможно, что событие ожидает, пока TextBox завершит рендеринг, прежде чем запускать событие, но я не уверен.

Решение Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

В «реальной жизни» я буду создавать пользовательский элемент управления на основе текстового поля и определять все состояния в Blend, и, возможно, добавлять грязное состояние или что-то подобное и управлять всем этим через логическое свойство. Тем не менее, вот некоторые доказательства концептуального кода, который, кажется, делает то, что мне нужно. Я думаю, что единственное реальное отличие от того, что вы пытались сделать, это то, что я отслеживаю «старое значение» и сравниваю его, когда текст изменяется, чтобы определить его чистоту. Магический сброс также контролирует это старое значение.

контрольный код:

namespace DirtyTextBox
{
    public class DirtyNotifyingTextBox : TextBox
    {
        public DirtyNotifyingTextBox()
        {
            this.DefaultStyleKey = typeof(TextBox);
            DataContextChanged += DirtyNotifyingTextBox_DataContextChanged;
        }

        private void DirtyNotifyingTextBox_DataContextChanged(Windows.UI.Xaml.FrameworkElement sender, Windows.UI.Xaml.DataContextChangedEventArgs args)
        {
            _originalValue = this.Text;
            TextChanged += DirtyNotifyingTextBox_TextChanged;
            SetToGreen();
        }

        private string _originalValue { get; set; }

        private void DirtyNotifyingTextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (this.Text != _originalValue)
            {
                SetToRed();
            }
            else
            {
                SetToGreen();
            }
        }

        private void SetToGreen()
        {
            this.BorderBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 50, 205, 0));
        }

        private void SetToRed()
        {
            this.BorderBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 255, 0, 0));
        }

        public void Reset()
        {
            Reset(string.Empty);
        }

        public void Reset(string resetValue)
        {
            _originalValue = resetValue;
            this.Text = resetValue;
        }

        protected override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
        }
    }
}

пример использования:

<StackPanel Orientation="Horizontal">
    <local:DirtyNotifyingTextBox x:Name="dtextbox" Width="250" Height="50" />
    <Button Content="reset" Click="Reset" Margin="10 0" />
    <Button Content="reset with value" Click="ResetWithValue" Margin="10 0" />
    <Button Content="change text with code" Click="UpdateText" Margin="10 0" />
</StackPanel>

код позади:

private void Reset(object sender, RoutedEventArgs e)
{
    dtextbox.Reset();
}

private void ResetWithValue(object sender, RoutedEventArgs e)
{
    dtextbox.Reset("Magic Reset");
}

private void UpdateText(object sender, RoutedEventArgs e)
{
    dtextbox.Text = "updated text";
}
0 голосов
/ 17 января 2019

Ответ очень прост: используйте логический флаг, чтобы различать, когда запускать «красный флаг», а когда зеленый.

...