Stackoverflow异常,因为' this.Content'?

时间:2017-09-23 23:13:24

标签: c# wpf user-controls out-of-memory

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

所以我有一个存储所有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 :(得分:0)

代码中的问题是UserControls中的this.Content=...(在这种情况下,this.Content UserControl内容不是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部分中有所描述。