【问题标题】:Changing Main Window Content from Utils Class从 Utils 类更改主窗口内容
【发布时间】:2018-12-06 13:55:59
【问题描述】:

当我尝试从 Utils 类更改 UI 时,出现错误进程因 StackOverflowException 而终止。 ColdStorageDesktopApp.exe 中出现“System.StackOverflowException”类型的未处理异常

 class Utils
            {
                MainWindow mainWindow = new MainWindow();
                private bool signedIn = false;

                public void UpdateUI()
                {
                    if (signedIn)
                    {
                        mainWindow.Sign_In_Button.Visibility = Visibility.Collapsed;
                        mainWindow.Sign_Out_Button.Visibility = Visibility.Visible;
                        mainWindow.Balance_Button.IsEnabled = true;
                        mainWindow.Send_Assets_Button.IsEnabled = true;
                        mainWindow.Settings_Button.IsEnabled = true;
                    }
                    else
                    {
                        mainWindow.Sign_In_Button.Visibility = Visibility.Visible;
                        mainWindow.Sign_Out_Button.Visibility = Visibility.Collapsed;
                        mainWindow.Balance_Button.IsEnabled = false;
                        mainWindow.Send_Assets_Button.IsEnabled = false;
                        mainWindow.Settings_Button.IsEnabled = false;
                    }
                }

这是我的 MainWindow.cs

public partial class MainWindow : Window
    {
        Utils utils = new Utils();

        public MainWindow()
        {
            InitializeComponent();

            utils.UpdateUI();
        }

【问题讨论】:

  • 那么这个案例的解决方法是什么?
  • 两边都需要初始化一个类才能做某事,你怎么看它断链?
  • 如果你要直接引用窗口中的控件,只需将逻辑放入MainWindow中还是不可能的?或者取出App.xaml中的StartupUri="MainWindow.xaml",将窗口创建和设置的逻辑放到App.xaml.cs中
  • 有很多页面使用这个功能,如果是这样,我必须为我拥有的每个类都编写它

标签: c# wpf windows


【解决方案1】:

StackOverflow 异常被抛出,因为你有一个无限循环创建对象实例。

MainWindow 创建Utils 创建MainWindow 创建Utils 创建MainWindow 创建Utils...等

您不应该在Utils 中创建MainWindow。应用中应该只有一个MainWindow 实例。

相反,将MainWindow 实例作为参数提供给Utils 实例:

class Utils
{
    readonly MainWindow mainWindow;
    public Utils(MainWindow mainWindow)
    {
        this.mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow));
    }
}

class MainWindow
{
    readonly Utils utils;
    public MainWindow()
    {
        InitilaizeComponent();
        utils = new Utils(this);
    }
}

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多