首页 > 解决方案 > MainWindow 不是启动窗口时的引用实例

问题描述

我正在为大学做一些申请,并且我已经成功地能够在我的应用程序中显示和折叠用户控件,但是当我尝试做的窗口不是应用程序启动时启动的窗口时,它就不起作用了。

当我单击其中一个标签(充当菜单)时,我有一个鼠标事件起作用:

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 和谷歌,但我似乎真的找不到解决方案。我不知道如何引用它。我在 MainWindow 是我初始化应用程序时启动的窗口时这样做了,但如果它不是第一个窗口,它只会给我错误

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

mainWindow was null.

我究竟做错了什么?

非常感谢你提前

标签: c#xaml

解决方案


我找到了我的问题和解决方案,所以我会在这里发布以防万一有人遇到类似问题。

我的主要问题是,当窗口是启动窗口时,我不明白为什么它可以工作,但不是。我只需要 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 中调用 MouseEvent 类上的 MouseClick 事件的方法。

        private void LeftClick(object sender, RoutedEventArgs e)
        {
            MouseEvents menu = new MouseEvents(this);
            menu.MouseClick(sender);
        }

推荐阅读