C# 打开新页面时,它与NavigationView菜单重叠

C# 打开新页面时,它与NavigationView菜单重叠,c#,visual-studio,xaml,uwp,C#,Visual Studio,Xaml,Uwp,我制作了一个基本的应用程序,它有一个带有两个选项的菜单,每个选项都指向一个新页面。问题是,这些页面是在主页面上启动的,因此它与菜单和后面的所有内容重叠。这些页面没有任何内容,它们的代码是一个简单的xaml和xaml.cs 我使用了微软开发者网页提供的一些例子,但结果是一样的。我还没有找到任何其他可能的解决办法,我无法理解发生了什么 包含菜单的页面 <Grid> <NavigationView x:Name="NavView" ItemInvoked="Nav

我制作了一个基本的应用程序,它有一个带有两个选项的菜单,每个选项都指向一个新页面。问题是,这些页面是在主页面上启动的,因此它与菜单和后面的所有内容重叠。这些页面没有任何内容,它们的代码是一个简单的xaml和xaml.cs

我使用了微软开发者网页提供的一些例子,但结果是一样的。我还没有找到任何其他可能的解决办法,我无法理解发生了什么

包含菜单的页面

<Grid>
  <NavigationView
    x:Name="NavView"
    ItemInvoked="NavViewItemInvoked"
    Windows10version1803:BackRequested="NavViewBackRequested"
    Windows10version1803:IsBackEnabled="{x:Bind Frame.CanGoBack, Mode=OneWay}"
  >
    <NavigationView.MenuItems>
      <NavigationViewItem x:Name="HomePage" Content="Home" Icon="Home" />
      <NavigationViewItem x:Name="AddPage" Content="Add" Icon="Add" />
    </NavigationView.MenuItems>

    <NavigationView.AutoSuggestBox>
      <AutoSuggestBox x:Name="SearchBox" QueryIcon="Find" />
    </NavigationView.AutoSuggestBox>

    <ScrollViewer>
      <frame x:Name="ContentFrame" Padding="12,0,12,24" IsTabStop="True" NavigationFailed="ContentFrame_NavigationFailed" />
    </ScrollViewer>
  </NavigationView>

  <frame x:Name="frame" Margin="20,0,0,0" Navigating="OnNavigatingToPage">
    <Frame.ContentTransitions>
      <TransitionCollection>
        <NavigationThemeTransition>
          <NavigationThemeTransition.DefaultNavigationTransitionInfo>
            <EntranceNavigationTransitionInfo />
          </NavigationThemeTransition.DefaultNavigationTransitionInfo>
        </NavigationThemeTransition>
      </TransitionCollection>
    </Frame.ContentTransitions>
  </frame>

  <VisualStateManager.VisualStateGroups>
    <VisualStateGroup>
      <VisualState>
        <VisualState.StateTriggers>
          <AdaptiveTrigger MinWindowWidth="{x:Bind NavView.CompactModeThresholdWidth}" />
        </VisualState.StateTriggers>
        <VisualState.Setters>
          <!-- Leave the next line for left-only navigation. -->
          <Setter Target="ContentFrame.Padding" Value="24,0,24,24" />
        </VisualState.Setters>
      </VisualState>
    </VisualStateGroup>
  </VisualStateManager.VisualStateGroups>
</Grid>
我希望有人能告诉我发生了什么或者哪里出了错


非常感谢

您的UI结构如下所示

  • NavigationView
    • Frame
      ContentFrame
  • Frame
    AppFrame
XAML中的基本规则是,对于同一级别的内容,代码后面的内容将绘制在前面的内容之上。当然,这是非常简单的,因为您可以以不重叠的方式布局面板的子级,但我们现在正在考虑您的特殊情况

导航视图
和第二个
框架
位于同一级别,并且都位于根
网格
内,没有指定任何
网格.列
网格.行
属性。在这种情况下,
框架
位于
导航视图
的正上方。起初,这并不重要,因为那里没有内容,因此
框架
是“不可见的”。但是,一旦您在
框架中实际导航,页面将完全覆盖
导航视图,而该视图将依次“消失”


然而,我感到困惑的是,代码中有两个
Frame
控件。您实际应该使用的是名为
ContentFrame
的。这是嵌入在
NavigationView
中的,这是显示页面最常用的方式。因此,如果您完全删除第二个
框架
,并将所有代码改为使用
ContentFrame
,您应该可以获得所需的行为。

UI的结构如下所示

  • NavigationView
    • Frame
      ContentFrame
  • Frame
    AppFrame
XAML中的基本规则是,对于同一级别的内容,代码后面的内容将绘制在前面的内容之上。当然,这是非常简单的,因为您可以以不重叠的方式布局面板的子级,但我们现在正在考虑您的特殊情况

导航视图
和第二个
框架
位于同一级别,并且都位于根
网格
内,没有指定任何
网格.列
网格.行
属性。在这种情况下,
框架
位于
导航视图
的正上方。起初,这并不重要,因为那里没有内容,因此
框架
是“不可见的”。但是,一旦您在
框架中实际导航,页面将完全覆盖
导航视图,而该视图将依次“消失”


然而,我感到困惑的是,代码中有两个
Frame
控件。您实际应该使用的是名为
ContentFrame
的。这是嵌入在
NavigationView
中的,这是显示页面最常用的方式。因此,如果您完全删除第二个
框架
,并将所有代码改为使用
ContentFrame
,您应该可以获得所需的行为。

据我所知,您的要求是拥有一个导航视图,该视图将使用一个框架在应用程序的不同页面之间导航

我简化了您的解决方案,希望这会有所帮助。 在下面的解决方案中,我使用了单个框架进行导航

XAML

<Grid>
    <NavigationView x:Name="NavView" ItemInvoked="NavViewItemInvoked">
        <NavigationView.MenuItems>
            <NavigationViewItem x:Name="HomePage" Content="Home" Icon="Home" />
            <NavigationViewItem x:Name="AddPage" Content="Add" Icon="Add" />
        </NavigationView.MenuItems>

        <NavigationView.AutoSuggestBox>
            <AutoSuggestBox x:Name="SearchBox" QueryIcon="Find" />
        </NavigationView.AutoSuggestBox>
        <!-- Removed scroll viewer not sure if this is required -->
        <Frame x:Name="ContentFrame" IsTabStop="True"
         NavigationFailed="ContentFrame_NavigationFailed" />            
    </NavigationView>
</Grid>


说明:

如上所述,此解决方案只有一个导航框架。 每当用户在导航视图中选择一个项目时,它都会将
ContentFrame
导航到所需的页面[
ContentFrame.navigate(pageType)
]; .


如果您需要更多的解释或根据我的理解参考

,请告诉我,您的要求是拥有一个导航视图,该视图将使用一个框架在应用程序的不同页面之间导航

我简化了您的解决方案,希望这会有所帮助。 在下面的解决方案中,我使用了单个框架进行导航

XAML

<Grid>
    <NavigationView x:Name="NavView" ItemInvoked="NavViewItemInvoked">
        <NavigationView.MenuItems>
            <NavigationViewItem x:Name="HomePage" Content="Home" Icon="Home" />
            <NavigationViewItem x:Name="AddPage" Content="Add" Icon="Add" />
        </NavigationView.MenuItems>

        <NavigationView.AutoSuggestBox>
            <AutoSuggestBox x:Name="SearchBox" QueryIcon="Find" />
        </NavigationView.AutoSuggestBox>
        <!-- Removed scroll viewer not sure if this is required -->
        <Frame x:Name="ContentFrame" IsTabStop="True"
         NavigationFailed="ContentFrame_NavigationFailed" />            
    </NavigationView>
</Grid>


说明:

如上所述,此解决方案只有一个导航框架。 每当用户在导航视图中选择一个项目时,它都会将
ContentFrame
导航到所需的页面[
ContentFrame.navigate(pageType)
]; .


如果您需要更多解释或参考

请告诉我,您可以告诉我们为什么在页面中使用2个框架吗?(ContentFrame和AppFrame)。另外,您有一个名为“frame”的框架我猜AppFrame和“frame”指的是同一个实例,对吗?很抱歉耽搁了。我对uwp应用程序开发不是很有经验。我知道那时我应该只有一个画面。是的,“AppFrame”指的是其中一个帧,可能是错误的,有两个帧。我稍后会尝试更改它,我会给你一些反馈。你能告诉我们为什么在你的页面中使用两个框架吗?(ContentFrame和AppFrame)。另外,您有一个名为“frame”的框架我猜AppFrame和“frame”指的是同一个实例,对吗?很抱歉耽搁了。我对uwp应用程序开发不是很有经验。我知道我应该只有一帧t
private void NavViewItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
    {
        var label = args.InvokedItem as string;
        var pageType =
            label == "Home" ? typeof(HomePage) :
            label == "Add" ? typeof(AddPage) : null;
        if (pageType != null && pageType != ContentFrame.CurrentSourcePageType)
        {
            ContentFrame.Navigate(pageType);
        }
    }