4

所以这里是场景。我有 3 个xaml

  • 主窗口
  • 第1页
  • 第2页

在 MainWindow 下,我有一个名为“Page1”的按钮和一个名为“Frame1”的框架

代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.
  Dim page1 As New Page1
  Frame1.Navigate(page1)
End Sub

所以它会显示Page1.xaml到“Frame1”

然后在下Page1.xaml,我有另一个名为“Page2”的按钮

代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
  Dim p2 As New page2
  Dim main As New MainWindow

  main.Frame1.Navigate(p2)
End Sub

单击“Frame1”内和“MainWindow”内的“Page1”内的按钮后,框架不会导致任何更改

我想我错过了一些东西......

4

1 回答 1

1

基本上,您的问题似乎是您在按钮 1 单击事件中实例化一个新的主窗口,而不是引用现有的主窗口。因此,当您实际调用 Frame1 Navigate 方法时,您实际上是在一个完全不同的窗口上执行此操作,而该窗口恰好是不可见的。

您需要做的是找到对 Page1 的父 MainWindow 的引用。这可以通过多种方式完成。

  • 您可以使用路由事件并从 Page1 引发它并在 MainWindow 上处理它。
  • 您在 Page1 上创建一个公共属性,并在创建 Page1 时将您的 MainWindow 实例传递给它。
  • 您还可以从 Page1 开始向上爬取可视化树,直到找到 MainWindow,然后进行导航。我将在下面的代码中演示这一点。

第 1 页的 XAML

<Page x:Class="WpfApplication1.Page1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"
    Title="Page1">

    <Grid>
        <Button HorizontalAlignment="Center"
                VerticalAlignment="Bottom"
                Click="Page2Button_Click"
                Content="Page 2" />
    </Grid>
</Page>

第 1 页的代码隐藏

using System.Windows;
using System.Windows.Media;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Page1.xaml
    /// </summary>
    public partial class Page1
    {
        public Page1()
        {
            InitializeComponent();
        }

        private void Page2Button_Click(object sender, RoutedEventArgs e)
        {
            var mainWindow = GetParentWindow(this);
            if (mainWindow != null) mainWindow.Frame1.Navigate(new Page2());
        }

        private static MainWindow GetParentWindow(DependencyObject obj)
        {
            while (obj != null)
            {
                var mainWindow = obj as MainWindow;
                if (mainWindow != null) return mainWindow;
                obj = VisualTreeHelper.GetParent(obj);
            }
            return null;
        }
    }
}
于 2013-02-08T13:29:27.980 回答