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