在 XAML 中定义的 WPF 窗口可以从其他类和表单公开访问其控件,除非您使用 x:FieldModifier 属性将它们明确标记为私有。
因此,如果您使主窗口的实例在另一个类中可访问,无论是 Window 还是其他任何东西,您都可以在第二个类中填充控件。
一种特殊情况是,当您想要从您在其上打开的子窗口更新主窗口中控件的内容时。在这种情况下,您可以将子窗口的 Owner 属性设置为当前的主窗口,以便在子窗口可见时访问它。例如,假设您定义了这两个窗口:
// MainWindow
<Window x:Class="TestApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox Name="mainListBox" Height="250" HorizontalAlignment="Stretch" VerticalAlignment="Top"/>
<Button Content="Open Another Window" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="20" Click="OpenAnotherWindow_Click"/>
</Grid>
</Window>
和
// AnotherWindow
<Window x:Class="TestApplication.AnotherWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="AnotherWindow" Height="300" Width="300">
<Grid>
<Button Content="Add New Item to Main Window" HorizontalAlignment="Center" VerticalAlignment="Center" Click="AddNewItem_Click"/>
</Grid>
</Window>
每个都在自己的 XAML 文件中。
在MainWindow 后面的代码中,在按钮单击处理程序内,您将AnotherWindow 的实例显示为对话框并将其Owner 属性设置为MainWindow 的实例:
private void OpenAnotherWindow_Click(object sender, RoutedEventArgs e)
{
AnotherWindow anotherWindow = new AnotherWindow();
anotherWindow.Owner = this;
anotherWindow.ShowDialog();
}
现在,您可以从AnotherWindow 的 Owner 属性访问MainWindow 的实例,以便在AnotherWindow 中的按钮单击处理程序中向其上定义的ListBox 控件添加新项目后面的代码:
private void AddNewItem_Click(object sender, RoutedEventArgs e)
{
MainWindow mainWindow = Owner as MainWindow;
mainWindow.mainListBox.Items.Add(new Random().Next(1000).ToString());
}
它只是在ListBox 中添加一个新的随机数,以显示代码如何访问和修改MainWindow 中的控件数据。