Ссылочный экземпляр, когда MainWindow не является окном запуска - PullRequest
0 голосов
/ 01 апреля 2020

Я делаю какое-то приложение для колледжа, и я успешно смог показать и свернуть пользовательские элементы управления в моем приложении, но когда окно, которое я пытаюсь сделать, это не то, которое открывается при запуске приложения, оно просто не ' t work.

У меня есть событие мыши, которое срабатывает, когда я нажимаю на одну из меток (выступая в качестве меню):

class MouseEvents
    {        public void MouseClick(object sender)
        {
            //creating an instance of MainWindow to be able to reference the labels and user controls
            MainWindow mainWindow = (MainWindow)Application.Current.MainWindow;
            List<Label> menuDown = new List<Label> { mainWindow.toolAddPlayer, mainWindow.toolSearchPlayer, mainWindow.toolAddMember, mainWindow.toolSearchMember, mainWindow.toolEditPass, mainWindow.toolEmailList };
            List<UserControl> userDown = new List<UserControl> { mainWindow.addPlayer, mainWindow.searchPlayer, mainWindow.addMember, mainWindow.searchMember, mainWindow.editPassword, mainWindow.EmailList };
            var menuItem = (Label)sender;
            for (int i = 0; i < 6; i++)
            {
                if (menuItem.Content == menuDown[i].Content)
                {
                    HideUserControls();
                    userDown[i].Visibility = Visibility.Visible;
                }
            }
        }

        public void HideUserControls()
        {
            MainWindow usingControls = (MainWindow)Application.Current.MainWindow;
            usingControls.addPlayer.Visibility = Visibility.Collapsed;
            usingControls.searchPlayer.Visibility = Visibility.Collapsed;
            usingControls.addMember.Visibility = Visibility.Collapsed;
            usingControls.searchMember.Visibility = Visibility.Collapsed;
            usingControls.editPassword.Visibility = Visibility.Collapsed;
            usingControls.EmailList.Visibility = Visibility.Collapsed;
        }
    }

В окне xaml (MainWindow.xaml), где Я хочу, чтобы мои пользовательские элементы управления появлялись или исчезали, у меня есть этот код

        <StackPanel DockPanel.Dock="Bottom" Height="440" Width="590">
            <local:AddPlayer x:Name="addPlayer" Visibility="Collapsed"/>
            <local:SearchPlayer x:Name="searchPlayer" Visibility="Collapsed"/>
            <local:AddMember x:Name="addMember" Visibility="Collapsed"/>
            <local:SearchMember x:Name="searchMember" Visibility="Collapsed"/>
            <local:EditPassword x:Name="editPassword" Visibility="Collapsed"/>
            <local:EmailList x:Name="EmailList" Visibility="Collapsed"/>
        </StackPanel>

И он отлично работает. Проблема в том, что я хочу добавить окно для входа в приложение (это окно входа в систему будет загружать MainWindow.xaml, когда я нажимаю кнопку входа в систему). Я изменил свой App.xaml, чтобы обновить StartupUri до LogIn.xaml

<Application x:Class="SimplyRugby_2._0.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:SimplyRugby_2._0"
             StartupUri="LogIn.xaml">
    <Application.Resources>

    </Application.Resources>
</Application>

. Таким образом, приложение запускается, как и должно быть, в окне входа в систему. Проблема возникает, когда я пытаюсь нажать на меню в окне MainWindow.

Я получаю ссылку не на экземпляр ошибки объекта. Я проверял на StackOverflow и Google, но я действительно не могу найти решение. Я не знаю, как ссылаться на это. Я сделал это, когда MainWindow было окном, которое запускается при инициализации приложения, но если это не первое окно, оно просто выдает мне ошибку

System.NullReferenceException: 'Object reference not set to an instance of an object.'

mainWindow was null.

Что я делаю не так?

Большое спасибо заранее

1 Ответ

0 голосов
/ 01 апреля 2020

Я нашел свою проблему и решение, поэтому я опубликую ее здесь на тот случай, если у кого-то возникнет аналогичная проблема.

Моя главная проблема заключалась в том, что я не мог понять, почему это работает, когда окно было окно запуска, но не тогда, когда этого не было. Мне просто нужно было создать экземпляр MainWindow (который не является окном запуска).

    class MouseEvents
    {      
        private MainWindow WindowMain { get; set; }

        public MouseEvents(MainWindow window)
        {
            this.WindowMain = window;
        }
        public void MouseClick(object sender)
        {
            List<Label> menuDown = new List<Label> { WindowMain.toolAddPlayer, WindowMain.toolSearchPlayer, WindowMain.toolAddMember, WindowMain.toolSearchMember, WindowMain.toolEditPass, WindowMain.toolEmailList };
            List<UserControl> userDown = new List<UserControl> { WindowMain.addPlayer, WindowMain.searchPlayer, WindowMain.addMember, WindowMain.searchMember, WindowMain.editPassword, WindowMain.emailList };
            Label menuItem = (Label)sender;
            for (int i = 0; i < 6; i++)
            {
                if (menuItem.Content == menuDown[i].Content)
                {
                    HideUserControls();
                    userDown[i].Visibility = Visibility.Visible;
                }
            }
        }

        public void HideUserControls()
        {
            WindowMain.addPlayer.Visibility = Visibility.Collapsed;
            WindowMain.searchPlayer.Visibility = Visibility.Collapsed;
            WindowMain.addMember.Visibility = Visibility.Collapsed;
            WindowMain.searchMember.Visibility = Visibility.Collapsed;
            WindowMain.editPassword.Visibility = Visibility.Collapsed;
            WindowMain.emailList.Visibility = Visibility.Collapsed;
        }
    }

И затем обновить метод из MainWindow, который вызывает событие MouseClick для класса MouseEvent.

        private void LeftClick(object sender, RoutedEventArgs e)
        {
            MouseEvents menu = new MouseEvents(this);
            menu.MouseClick(sender);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...