问题 WPF获取父窗口


HY,

在我的MainWindow.xaml.cs文件中,我创建了一个getter来获取对我的列表框的引用。

public ListBox LoggerList
{
    get { return Logger; }
}    

现在我想从普通类访问LoggerList但我不工作。我尝试了以下方法:

MainWindow parentWindow = Window.GetWindow(this) as MainWindow;
object selectedItem = parentWindow.LoggerList;

但这仅适用于* xaml.cs文件,而不适用于普通的* .cs文件。

最好的祝福


1228
2018-04-04 07:52


起源

WPF ListBox是可绑定的,而不是列表框的属性,你应该有一个包含你的项目的属性,并将它们绑定到列表框(LoggerList.ItemSource = myList;然后你将能够将你的类绑定到多个Windows,所以你将能够使用它们。你现在处理它的方式不是正确的方法。你应该研究绑定和基本的WPF示例。 - woutervs
尝试这个: Window parentWindow = Application.Current.MainWindow。 - Anatoliy Nikolaev
Hy,用Window parentWindow = Application.Current.MainWindow试了一下。但是我无法获得LoggerList。 - user2644964
我需要这个,因为我想在添加一个元素后自动滚动lsit框:LoggerList.ScrollIntoView(LoggerList.Items [LoggerList.Items.Count - 1]); - user2644964


答案:


有很多方法可以访问 Window在WPF中。如果你有几个打开,那么你可以像这样迭代它们:

foreach (Window window in Application.Current.Windows) window.Close();

如果您有特定类型的自定义 Window,你可以用这个:

foreach (Window window in Application.Current.Windows.OfType<YourCustomWindow>()) 
    ((YourCustomWindow)window).DoSomething();

如果你刚刚参考了 MainWindow,那么你可以简单地使用这个:

Window mainWindow = Application.Current.MainWindow;

但是,使用此方法,它有可能返回 null。在这种情况下,请确保设置 MainWindow 在它的构造函数中的this属性:

// From inside MainWindow.xaml.cs
Application.Current.MainWindow = this;

但应该注意,@ woutervs是正确的......你应该这样做  从中访问UI控件 Window在图书馆课程中。你真的应该将数据绑定到 ListBox.ItemsSource 然后操纵数据集合。


更新>>

我不知道你为什么 Application.Current 对象是 null...这可能是因为你已经将你的类库加载到另一个库中 AppDomain。无论哪种方式,我认为你错过了大局。实际上没有理由为类库类需要对main的引用 Window

如果您需要对数据集合执行一些工作,那么只需从后面的代码或视图模型中传递数据集合。工作完成后,只需将其传递回您可以访问的UI ListBox 和/或绑定到数据的集合 ItemsSource 属性。


15
2018-04-04 08:00



Hy,用Window parentWindow = Application.Current.MainWindow试了一下。但是我无法获得LoggerList。我需要这个,因为我想在添加一个元素后自动滚动列表框:LoggerList.ScrollIntoView(LoggerList.Items [LoggerList.Items.Count - 1]); - user2644964
请再次阅读我的第二段。 - Sheridan
Hy,我还在它的构造函数中将MainWindow设置为此属性。是的,我将一个可观察的集合绑定到列表,但列表框不会自动滚动绑定。你的意思是那个还是别的什么? - user2644964
你可以做一个 ListBox 通过设置您选择的项目滚动到位置 Observablecollection<T>......看到了 如何在MVVM WPF应用程序中控制ListBox的滚动位置 有关详细信息,请参阅Stack Overflow上的问题。 - Sheridan
非常感谢你的链接。 - user2644964