Текстовое поле, отображаемое как нулевой WPF

#c# #wpf #xaml

Вопрос:

У меня есть 3 текстовых поля, которые пользователь может изменить, чтобы изменить цвета RGB определенных цветов окна. Что я делаю, чтобы предоставить им визуализацию, так это помещаю рядом с указанными текстовыми полями поле, в котором отображается цвет, который они создают с указанными значениями RGB в текстовых полях. Для этого я установил событие TextChanged для всех 3 текстовых полей в метод, который извлекает текст из 3 текстовых полей, преобразует их в целое число с помощью TryParse, присваивает числа кисти, а затем назначает кисть в поле, чтобы пользователь мог его видеть. XAML выглядит следующим образом:

 <TextBox Name="ColorPickerDisplayRed" Background="Transparent"
         BorderBrush="Transparent"
         FontFamily="Moon 2.0"
         Foreground="#6BAAFF"
         Text="255"
         TextAlignment="Center"
         Margin="0, -1.2, 0, 0"
         TextChanged="UpdateColorPickerDisplay"/>
 

Я скопировал и вставил это для зеленого и синего, так что все совпадает, за исключением имени текстового поля. Затем, чтобы получить целочисленные значения, у меня есть это:

 private void UpdateColorPickerDisplay(object sender, TextChangedEventArgs e)
    {

        int R;
        int G;
        int B;

        if (int.TryParse(ColorPickerDisplayRed.Text, out R)) ;
        if (int.TryParse(ColorPickerDisplayGreen.Text, out G)) ;
        if (int.TryParse(ColorPickerDisplayBlue.Text, out B)) ;

        var brush = new SolidColorBrush(Color.FromArgb(255, (byte)R, (byte)G, (byte)B));
        ColorPickerDisplay.Background = brush;
    }
 

Но когда я запускаю его, я получаю сообщение об ошибке «ColorPickerDisplayGreen был равен нулю». Затем я попытался просто задать текст для каждого поля в качестве теста и получил ту же ошибку. Я попробовал это для всех 3 текстовых полей, и это сработало только для красного. Это потому, что я вызываю один и тот же метод из всех 3 текстовых полей?

Решено, не знал, что TextChanged был вызван немедленно.

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

1. Скорее всего, это побочный эффект TextChanged события. Он запускается до создания экземпляра других текстовых полей. Если вы хотите управлять своими текстовыми полями с помощью событий, позаботьтесь о том, чтобы установить флаг в начале обработчика событий, чтобы все нежелательные события (запущенные слишком рано) не обрабатывались. Как только форма будет полностью загружена, снимите флажок и принудительно инициализируйте текстовые поля.

2. вы пробовали поставить на нем точку останова, чтобы видеть, когда вызывается событие ?

Ответ №1:

Добавить ? перед доступом к свойству Text amp; это устранит проблему

             int R;
            int G;
            int B;

            if (int.TryParse(ColorPickerDisplayRed?.Text, out R)) ;
            if (int.TryParse(ColorPickerDisplayGreen1?.Text, out G)) ;
            if (int.TryParse(ColorPickerDisplayBlue?.Text, out B)) ;

            var brush = new SolidColorBrush(Color.FromArgb(255, (byte)R, (byte)G, (byte)B));
            ColorPickerDisplayRed.Background = brush;