首页 文章

由于'this.Content',Stackoverflow异常?

提问于
浏览
0

所以这听起来很奇怪,但是当我执行'this.Content'3次时,我总是得到一个stackoverflow异常 .

所以我有一个主窗口存储所有userControls所以我不必总是创建它们:

public partial class MainWindow : Window
{
    CreateSessionWindow csw;
    RateSessionWindow rsw;
    CloseSessionWindow closesw;
    MainMenuWindow mmw;

    public MainWindow()
    {
        InitializeComponent();
        csw = new CreateSessionWindow();
        rsw = new RateSessionWindow();
        closesw = new CloseSessionWindow();
        mmw = new MainMenuWindow();
        AllSessionWindows.csw = csw;
        AllSessionWindows.rsw = rsw;
        AllSessionWindows.closesw = closesw;
        AllSessionWindows.mmw = mmw;
    }

    private void bttnStartProgram_Click(object sender, RoutedEventArgs e)
    {
        this.Content = AllSessionWindows.mmw;
    }
}

public static class AllSessionWindows
{
    public static RateSessionWindow rsw;
    public static CloseSessionWindow closesw;
    public static CreateSessionWindow csw;
    public static MainMenuWindow mmw;

}

在我的MainMenuWindow类中,我有一个按钮,当我点击按钮时,它会更改内容:

public partial class MainMenuWindow : UserControl
{
    public MainMenuWindow()
    {
        InitializeComponent();
    }

    private void bttnCreateSession_Click(object sender, RoutedEventArgs e)
    {
        this.Content = AllSessionWindows.csw; //here
    }
}

这里是我通常得到的stackoverflowexception:

public partial class CreateSessionWindow : UserControl
{
    public CreateSessionWindow()
    {
        InitializeComponent();
    }

    private void bttnGoBack_Click(object sender, RoutedEventArgs e)
    {
        this.Content = AllSessionWindows.mmw; //here I always get the exception
    }
}

所以无论我以什么顺序调用this.Content(例如,第一个mmw而不是csw或csw而不是mmw)我总是得到一个stackoverflow异常,当我调用它3次,你可以看到上面 . 可能是什么问题?

1 回答

  • 0

    您的代码中的问题是UserControls中的 this.Content=... (在这种情况下 this.ContentUserControl 内容而不是 Window 内容) . 如果要在主窗口中更改内容,则应将MainWindow的属性添加到类 AllSessionWindows

    public static class AllSessionWindows
    {
        public static MainWindow MainWindow;
        public static RateSessionWindow rsw;
        public static CloseSessionWindow closesw;
        public static CreateSessionWindow csw;
        public static MainMenuWindow mmw;
    }
    

    在MainWidnow构造函数中,您必须分配此属性:

    public MainWindow()
    {
        InitializeComponent();
     ...
         AllSessionWindows.MainWindow = this;
    }
    

    在UserControl中,您应该使用以下代码:

    private void bttnCreateSession_Click(object sender, RoutedEventArgs e)
    {
        AllSessionWindows.MainWindow.Content = AllSessionWindows.csw; 
    }
    

    您提出的解决此类问题的方法并非最佳解决方案 . 对于这种问题,您可以使用Caliburn.Micro框架 . 在以下链接中,您可以找到一个很好的教程:

    http://www.mindscapehq.com/blog/index.php/2012/1/12/caliburn-micro-part-1-getting-started/

    您的问题在本教程的56部分中进行了描述 .

相关问题