Невозможно получить доступ к кнопке из интерфейса пользователя drag n drop - PullRequest
0 голосов
/ 07 июня 2018

Я создал новое приложение WPF в Visual Studio и поместил кнопку с помощью редактора перетаскивания, но не могу получить доступ к кнопке в своем файле .cs с помощью

MainButton.Content = "Set output to red";

, но получаюошибка

System.NullReferenceException: 'Ссылка на объект не установлена ​​для экземпляра объекта.'

MainButton был нулевым при запуске приложения.

Редактор перетаскивания сгенерировал этот xaml-файл

<Window x:Class="WpfApp1.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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Border HorizontalAlignment="Center" VerticalAlignment="Center" BorderBrush="Black" BorderThickness="3">
            <TextBlock x:Name="Output" Background="Transparent" TextAlignment="Center" TextWrapping="Wrap" Text="Output" Height="88" Width="264"/>
        </Border>
        <RadioButton x:Name="Option1" Content="Red Pill" HorizontalAlignment="Left" Margin="135,75,0,0" VerticalAlignment="Top" Checked="RadioButton_Checked" IsChecked="True"/>
        <RadioButton x:Name="Option2" Content="Blue Pill" HorizontalAlignment="Left" Margin="536,72,0,0" VerticalAlignment="Top" Checked="RadioButton_Checked_1"/>
        <Button x:Name="MainButton" Content="Set output to red" HorizontalAlignment="Left" Margin="279,100,0,0" VerticalAlignment="Top" Width="213" Height="41" Click="MainButton_Click"/>
    </Grid>
</Window>

Вот файл .cs

using System.Windows;
using System.Windows.Media;

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


        private void MainButton_Click(object sender, RoutedEventArgs e)
        {
            if ((bool)Option1.IsChecked)
            {
                Output.Background = Brushes.Crimson;
            }
            else
            {
                Option2.IsChecked = true;
                Output.Background = Brushes.DodgerBlue;
            }
        }

        private void RadioButton_Checked(object sender, RoutedEventArgs e)
        {
           MainButton.Content = "Set output to red";
        }

        private void RadioButton_Checked_1(object sender, RoutedEventArgs e)
        {
            MainButton.Content = "Set output to blue";
        }
    }
}

Я могу получить доступ к другим вещам в пользовательском интерфейсе просто отлично, например к радиокнопкам и текстовым блокам, но некнопка.Почему это может происходить?

1 Ответ

0 голосов
/ 07 июня 2018

На этапе инициализации некоторые переменные будут нулевыми, поскольку они не были достигнуты в порядке вызова.RadioButton_Checked вызывается через событие перед созданием кнопки, поскольку она содержит свойство Checked.

Быстрое и простое исправление заключается в следующем: проверка на нулевое значение в вызовах событий.

private void RadioButton_Checked (object sender, RoutedEventArgs e)
{
    if(MainButton != null)
        MainButton.Content = "Set output to red";
}

private void RadioButton_Checked_1 (object sender, RoutedEventArgs e)
{
    if (MainButton != null)
        MainButton.Content = "Set output to blue";
}

Конечно, есть лучшие способы справиться с этим.Вы можете установить флажок для отдельного события, Initialized, что сделает его намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...