В приложении WPF как сделать так, чтобы события реагировали только на действия пользователя? - PullRequest
0 голосов
/ 05 ноября 2019

Ниже представлен мой код.

MainWindows.xaml :

<Window x:Class="WpfApp2.MainWindow"
        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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel Margin="5">
        <TextBox x:Name="a" TextChanged="a_TextChanged" />
        <TextBox x:Name="b" Margin="0 5 0 0" TextChanged="b_TextChanged" />
        <TextBox x:Name="c" Margin="0 5 0 0" />
    </StackPanel>
</Window>

MainWindow.xaml.cs :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void a_TextChanged(object sender, TextChangedEventArgs e)
        {
            b.Text = "bb";
        }

        private void b_TextChanged(object sender, TextChangedEventArgs e)
        {
            c.Text = "cc";
        }
    }
}

Результат выглядит так:

enter image description here

Как видите, когда я вручную изменяю текст в a, bбыл изменен программно, что, в свою очередь, изменилось c. Я надеюсь, что b обработчик событий b_TextChanged будет запущен только пользовательской операцией (пользователь вводит некоторые символы в b). Программное изменение b 's Text свойства не должно вызывать b_TextChanged. Как я могу это реализовать?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

возможно, пришло время переключиться на MVVM?

private string _a;
public string A
{
    get { return _a; }
    set { SetA(value, true); }
}

protected void SetA(string value, bool isUserInput)
{
    _a = value;
    if (isUserInput)
    {
        // aditional operations
    }
    OnPropertyChanged("A");
}

Пользовательский ввод в TextBox вызовет установщик свойства через привязку, isUserInput будет true.

<TextBox x:Name="a" Text="{Binding A}" />

Любые изменения в логике программы могут быть выполнены с использованием метода Set с флагом false: SetA("new value", false);

1 голос
/ 05 ноября 2019

Просто используйте флаги, чтобы объявить, что код за изменением работает:

namespace WpfApp2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private bool _nonUserChange = false;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void a_TextChanged(object sender, TextChangedEventArgs e)
        {
            DoNonUserChange(() => b.Text = "bb");
        }

        private void b_TextChanged(object sender, TextChangedEventArgs e)
        {
            DoNonUserChange(() => c.Text = "cc");
        }

        private void DoNonUserChange(Action act)
        {
            if (act != null && !_nonUserChange)
            {
                _nonUserChange = true;
                act();
                _nonUserChange = false;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...