【问题标题】:host WPF windows in another WPF window在另一个 WPF 窗口中托管 WPF 窗口
【发布时间】:2014-06-24 11:57:24
【问题描述】:

这是我的问题:我在 XAML (vb.net) 中创建了一个名为 mainWindow 的主窗口,在里面我有 2 个按钮(有效和停止)和一个位于中心的网格。 我有另外两个用 XAML (vb.net) 编写的小窗口(有效窗口和停止窗口),它们有按钮、文本框......

我想,当我点击有效按钮或停止按钮时,在我的 mainWindow 的网格内显示有效窗口或停止窗口,所以我的 mainWindow.vb 中有这段代码:

enter code here

Private Sub valid_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles valid.Click
        Dim content As Object = valid_.Content /*Classe valid_ (a window in xaml)*/
        valid_.Content = Nothing
        Me.Grid.Children.Add(content)
    End Sub

    Private Sub stop_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles stop.Click
        Dim content As Object = stop_.Content
        stop_.Content = Nothing
        Me.Grid.Children.Add(content)
    End Sub

所以当我点击主窗口中的有效按钮时,它会在我的网格中显示有效窗口。

第一个问题:然后当我在我的主窗口中单击停止按钮时,停止窗口位于有效窗口的正上方,这不太好,有没有办法在显示第二个窗口之前清除网格?

最后,最大的问题是:我需要多次单击有效按钮或停止按钮,但是当我第二次单击时出现空引用异常:Me.Grid.Children.Add(content) content is null after第一次通话,所以我只能在我的按钮上单击一次。

请问如何修复它以便多次单击我的按钮? 谢谢你。

【问题讨论】:

    标签: wpf vb.net xaml


    【解决方案1】:

    又一次,有人写了一些无效的代码,然后说为什么这段代码不起作用?如果你查看你的代码,你应该会看到一些东西:

    Private Sub valid_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles valid.Click
        Dim content As Object = valid_.Content /*Classe valid_ (a window in xaml)*/
        Me.Grid.Children.Add(content)
    End Sub
    

    我猜你的Valid Window 有一个私有变量,正如你所说的:valid。在这一行,你对你的变量做了什么?:

    valid_.Content = Nothing
    

    没错!您将其Content 属性设置为null。因此,我不太确定您为什么对第一次尝试后是 null 感到惊讶。

    请问我该如何解决这个问题才能多次点击我的按钮?

    尝试删除将Content 属性设置为null 的行。


    更新>>>

    你的问题真的是因为你不能同时在两个地方显示任何 UI 元素。您将Window.Content 复制到DataGrid 的整个想法是完全错误的,但为了简洁起见,您的解决方法只是将您的内容移回Window,而不是每次都将其设置为null .试试这样的:

    Private Sub valid_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles valid.Click
        If Me.Grid.Children.Count > 0 Then           'Put content back where it belongs
            Dim oldContent = Me.Grid.Children(0)
            stop.Content = oldContent
            Me.Grid.Children.Remove(oldContent)
        EndIf
        Dim content As Object = valid_.Content /*Classe valid_ (a window in xaml)*/
        valid_.Content = Nothing
        Me.Grid.Children.Add(content)
    End Sub
    

    请原谅任何代码错误,因为我不编写 VB.NET。此外,您还需要更新其他方法。

    【讨论】:

    • 不,按照你说的做是不可能的,因为当我删除这一行时,不可能在按钮上单击一次,我有一个错误:指定元素已经是另一个元素的逻辑子元素
    • 请先学习如何编程,然后再开始宣布某事是不可能的。您的问题实际上是由于您无法同时在两个地方显示任何 UI 元素。但是,您应该试图将内容从一个窗口移动到另一个窗口。相反,您应该声明模板并让框架在每次显示时重新生成您的内容。
    • 您的解决方案有效,但当然不是很好,如果我有 10 个按钮怎么样...我想这就是您在谈论模板的原因。你能告诉我你的其他模板解决方案吗?
    • 让我们清楚这一点......这个不太好解决方案是你的。我告诉过你,你不应该这样做。此外,要了解如何使用DataTemplates 来交替控​​制显示?,您需要提出另一个问题。在 Stack Overflow 上,我们每篇文章都会问一个特定的问题。由于这个答案已经回答了 this 问题的细节,您现在应该mark it as accepted 并提出一个新问题。您可以从您的新问题中提供指向该问题的链接以提供一些上下文。
    • 我愿意接受您的回答,但我在此网页上看不到任何按钮...
    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多