#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;