所以这听起来很奇怪,但是当我执行'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 回答
您的代码中的问题是UserControls中的
this.Content=...
(在这种情况下this.Content
是UserControl
内容而不是Window
内容) . 如果要在主窗口中更改内容,则应将MainWindow的属性添加到类AllSessionWindows
:在MainWidnow构造函数中,您必须分配此属性:
在UserControl中,您应该使用以下代码:
您提出的解决此类问题的方法并非最佳解决方案 . 对于这种问题,您可以使用Caliburn.Micro框架 . 在以下链接中,您可以找到一个很好的教程:
http://www.mindscapehq.com/blog/index.php/2012/1/12/caliburn-micro-part-1-getting-started/
您的问题在本教程的5和6部分中进行了描述 .