我正在开发一个基于页面的程序,所以我有一个主菜单,它加载一个 Basewindow,其中包含一个框架,其中页面位于内部,具体取决于指定的 uri,如下所示:
BaseWindow xaml 代码:
<Window ...>
<Toolbar>
<Button>
</Button>
<!--
Same toolbar for all pages
-->
</Toolbar>
<StackPanel Name="c">
<Border BorderThickness="0,2,0,0">
<Border.BorderBrush>
<SolidColorBrush Color="{DynamicResource {x:Static SystemColors.ActiveCaptionColorKey}}"/>
</Border.BorderBrush>
</Border>
<Frame Name="contentFrame" NavigationUIVisibility="Hidden" />
</StackPanel>
</Window>
基本窗口 C#:
public Uri FormUri {
get => formUri;
set {
if (value != null) {
formUri = value;
//sets the content inside frame
MainFrame.Navigate(formUri);
}
}
}
public BaseWindow(Uri formUri) {
InitializeComponent();
FormUri = formUri;
MainFrame.ContentRendered += MainFrame_ContentRendered;
}
private void MainFrame_ContentRendered(object sender, EventArgs e) {
content = (IBasePage)MainFrame.Content;
}
public void FirstRegister() {
content.FirstRegister();
}
/*
some methods
*/
问题是我需要从这个类外部调用FirstRegister()
,如果窗口关闭/内容未加载,它会抛出异常,所以我想我需要的是获取MainFrame.ContentRendered
事件并将其公开,在类中我需要调用内容方法在事件签名中执行此操作。
这是例外:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
在这一行中:
public void FirstRegister() {
content.FirstRegister(); //<-- content
}
在调用该方法之前,您需要等到引发Frame
的ContentRendered
事件并且content
字段已初始化。
例如,您可以检查content
字段是否已在FirstRegister()
方法中初始化,并等待调用FirstRegister()
方法,直到引发ContentRendered
事件(如果尚未引发(:
public void FirstRegister()
{
if (content != null)
{
content.FirstRegister();
}
else
{
MainFrame.ContentRendered += (s, e) =>
{
if (content != null)
content.FirstRegister();
};
}
}
或者,您可以在 BaseWindow
类中定义一个自定义事件,在 MainFrame_ContentRendered
事件处理程序中引发此事件,然后等待调用该方法,直到引发它:
var wind = new BaseWindow(uri);
win.YourEvent += (ss,ee) => wind.FirstRegister();
wind.show();