C# 如何使命令栏朝屏幕底部打开?

C# 如何使命令栏朝屏幕底部打开?,c#,xaml,visual-studio-2015,windows-10,uwp,C#,Xaml,Visual Studio 2015,Windows 10,Uwp,我有一个很可能是愚蠢的怀疑,但我真的不知道如何解决这个问题 我有一个复杂的UI,里面有很多项(一个包含其他内容的SplitView,然后是一个包含页面的框架,在这里我有一个网格,最后是我的CommandBar) 当我点击“…”按钮时,CommandBar将朝窗口顶部打开,它实际上还覆盖了其父页面所在框架之外的部分UI(我不知道这是怎么可能的) 我尝试设置命令栏、父网格、页面等的垂直对齐属性。。。到顶部,但命令栏仍向屏幕顶部打开 有没有办法让它朝底部打开,就像内置天气或照片应用程序中的命令栏一样

我有一个很可能是愚蠢的怀疑,但我真的不知道如何解决这个问题

我有一个复杂的UI,里面有很多项(一个包含其他内容的SplitView,然后是一个包含页面的框架,在这里我有一个网格,最后是我的CommandBar)

当我点击“…”按钮时,CommandBar将朝窗口顶部打开,它实际上还覆盖了其父页面所在框架之外的部分UI(我不知道这是怎么可能的)

我尝试设置命令栏、父网格、页面等的垂直对齐属性。。。到顶部,但命令栏仍向屏幕顶部打开

有没有办法让它朝底部打开,就像内置天气或照片应用程序中的命令栏一样?我是否缺少此处的设置/属性

谢谢你的帮助

塞尔吉奥

编辑:为了清楚起见,我的页面的基本结构如下:

RootContent > ... > Frame > Page > Grid > CommandBar

无法将命令栏放在页面内。TopAppBar就好像我这样做了一样,命令栏放在页面外并覆盖UI顶部。我需要将命令栏放在页面内。

您如何定义命令栏?有两种方法可以做到这一点:

<Page.BottomAppBar>
    <CommandBar>
    ....
    </CommandBar>
</Page.BottomAppBar> 

....
或者恰恰相反

<Page.TopAppBar>
    <CommandBar>
    ....
    </CommandBar>
</Page.TopAppBar> 

....

在您的情况下,您可能希望使用前者,并确保您的appbar不在任何其他容器中。

您使用commandbar的目的不是为了实现它。它应该在显示时覆盖页面内容


如果你不能改变某些东西的行为方式(如本例中),那么另一种选择将是一个不同的控件(据我所知,没有任何东西能完全满足你的要求)也可以自己创建。

命令栏依赖于VisualStates来控制其维度和动画的这一部分。这使得使用自定义可视化状态管理器拦截状态更改调用并用OpenDown调用替换所有OpenUp调用变得很容易

public class OpenDownCommandBarVisualStateManager : VisualStateManager
{
    protected override bool GoToStateCore(Control control, FrameworkElement templateRoot, string stateName, VisualStateGroup group, VisualState state, bool useTransitions)
    {
        //replace OpenUp state change with OpenDown one and continue as normal
        if(!string.IsNullOrWhiteSpace(stateName) && stateName.EndsWith("OpenUp"))
        {
            stateName = stateName.Substring(0, stateName.Length - 6) + "OpenDown";
        }
        return base.GoToStateCore(control, templateRoot, stateName, group, state, useTransitions);
    }
}

public class OpenDownCommandBar : CommandBar
{
    public OpenDownCommandBar()
    {
    }

    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var layoutRoot = GetTemplateChild("LayoutRoot") as Grid;
        if(layoutRoot != null)
        {
            VisualStateManager.SetCustomVisualStateManager(layoutRoot, new OpenDownCommandBarVisualStateManager());
        }
    }
}
然后只需使用新的OpenDownCommandBar,而不是普通的OpenDownCommandBar

<myControls:OpenDownCommandBar>...</myControls:OpenDownCommandBar>
。。。

我已经更新了我的问题,因为我已经说过命令栏放在页面的网格中。我不能将它放在Page.TopAppBar部分,因为这样做会导致工具栏超出页面并覆盖我的UIT的顶部这是一种奇怪的使用commandbar的方式。但是如果你不发布你的XAML我的XAML是一团糟,我的意思是,在进入实际的命令栏之前,我的根可视化树中有10个不同的控件。我只是想知道是否可以在不将其设置为页面的情况下将其底部打开。TopAppBarI不确定,因为我从未在其他地方放置过命令栏-我建议您重新查看UI设计,以便可以将命令栏放置在appbar中。如果您查看视觉树,你会注意到,命令栏位于所有东西之外的一个弹出窗口中。文档中说,命令栏可以放在应用程序中的任何位置。我100%满意它在扩展时覆盖了UI的一部分,我只是希望它能朝着屏幕的底部而不是顶部打开。它的所有其他功能都可以正常工作expected@Sergio0694所以你想改变它的行为方式。因此,我的第二段仍然适用这项工作非常完美,我从来没有想到会有一个定制的VisualStateManager来做到这一点,非常感谢您的帮助!