从父窗口WPF调用渲染页面内容的方法

时间:2017-11-17 14:05:57

标签: c# wpf xaml window

我正在开发一个基于页面的程序,所以我有一个主菜单,它加载一个Basewindow,其中包含一个框架,页面内部取决于指定的uri,如下所示:

BaseWindow xaml代码:

List<WebElement> myElements = driver.findElements(By.xpath("//*[@id='printable-area']/table[" + r + "]/tbody/tr[4]/td/a[@class='ng-binding ng-scope']/span[@class='ng-binding ng-scope']"));
List<String> partA = new ArrayList<String>();
List<String> partB = new ArrayList<String>();
for(int i=0; i<myElements.size(); i=i+2)
{
    String textA = myElements.get(i).getAttribute("innerHTML");
    partA.add(textA);
}

for(int j=1; j<myElements.size(); j=j+2)
{
    String textB = myElements.get(j).getAttribute("innerHTML");
    partB.add(textB);
}
System.out.println("The Complete Addresses are : ");
for(int k=0; k<partA.size();k++)
    System.out.println(partA.get(k) + " , " + partB.get(k));    

BaseWindow C#:

<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>

问题是我需要从这个类之外调用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.'

1 个答案:

答案 0 :(得分:1)

在调用方法之前,您需要等到ContentRendered的{​​{1}}事件被引发并且Frame字段已初始化。

例如,您可以检查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