从父窗口 WPF 调用呈现页面内容的方法



我正在开发一个基于页面的程序,所以我有一个主菜单,它加载一个 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
}

在调用该方法之前,您需要等到引发FrameContentRendered事件并且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();

最新更新