【问题标题】:How to manipulate a window object from another class in WPF如何从 WPF 中的另一个类操作窗口对象
【发布时间】:2011-08-28 18:03:29
【问题描述】:

我是 WPF 和 C# 的新手。我知道很多 VB.NET,而且我习惯了调用文本框等表单对象的方式。我从另一个表单调用它。现在,我正在使用 WPF,我很困惑。因为我有一个主窗口。我想从一个类中添加一个项目到主窗口的列表框中。在 VB.Net 中,就是这样。

    IN FORM2

    Form1.Textbox.Text = "";

在 WPF 中我无法做到这一点。有人可以帮帮我吗。谢谢!

【问题讨论】:

  • 你可以,如果你有对窗口对象的引用。
  • 视情况而定,一种方法是将该引用传递给另一个类的构造函数并将其存储在一个字段中。你也必须在 VB.NET 中做类似的事情。

标签: c# wpf vb.net forms


【解决方案1】:

在 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 中的控件数据。

【讨论】:

  • 不知道为什么,但它一直给我异常 mainWindow 为空:|有什么想法可能是我的问题吗?
【解决方案2】:

纯 WPF 解决方案,但在您的情况下也可能是最简单的,使用 Data Binding in WPF

每个表单的控件都绑定到 ModelView 上的一些数据(纯 MVVM 方法)或数据(或多或少就像 yuo 在 WindowsForms 中可以做到的那样)。因此,您要做的“唯一”事情就是读取/写入绑定到该表单 UI 上的控件的数据。

例如,您在 Windows 上有 TextBox 并希望从中读取数据。 这个TextBox 绑定到类的一些string 属性,该属性负责保存该表单上控件的数据(只是一个示例,在现实世界中可能是1000 个其他解决方案,基于开发人员的决定)。所以你需要的是不是说:“窗口给出文本框”并且在阅读TextBox's内容之后,但是只是阅读绑定的string属性。

当然,这是对事物的非常简单的描述。但只是给你一个提示。按照上面提供的数据绑定链接了解有关此内容的更多信息。不怕东西很多,毕竟不是一个复杂的想法,也很直观。为了让这些东西在简单的情况下工作,你不需要我付出巨大的努力。当你最终进入现实世界的应用程序时,这些东西变得非常复杂。

【讨论】:

    【解决方案3】:

    这将获取所有活动窗口:

    foreach (Window item in Application.Current.Windows)
    {
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2010-11-20
      • 2019-06-13
      • 1970-01-01
      相关资源
      最近更新 更多