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

我有一个复杂的用户界面,里面有很多项目(一个 SplitView 里面有其他东西,然后是一个包含页面的框架,我有一个网格,最后是我的 CommandBar)。

当我点击“...”按钮时,CommandBar 会朝窗口顶部打开,并且它实际上还覆盖了其父页面所在的 Frame 之外的部分 UI(我不知道那是怎么回事可能的)。

我尝试将 CommandBar、父网格、页面等的 VerticalAlignment 属性设置为 Top,但 CommandBar 仍然朝屏幕顶部打开。

c# - 如何使 CommandBar 朝屏幕底部打开?-LMLPHP

有没有办法让它朝底部打开,就像内置天气或照片应用程序中的 CommandBar 一样?我在这里缺少设置/属性吗?

感谢您的帮助!

塞尔吉奥

编辑: 只是为了清楚,我的页面的基本结构是这样的:

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

不能 将 CommandBar 放在 Page.TopAppBar 内,就好像我这样做一样,CommandBar 被放置在我的页面之外并覆盖我的 UI 顶部。我需要将 CommandBar 放置在页面内。

最佳答案

CommandBar 依赖 VisualStates 来控制这部分的尺寸和动画,这使得使用自定义视觉状态管理器来拦截状态更改调用并将所有 OpenUp 调用替换为 OpenDown 调用变得容易。

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 而不是普通的。
<myControls:OpenDownCommandBar>...</myControls:OpenDownCommandBar>

关于c# - 如何使 CommandBar 朝屏幕底部打开?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33290361/

10-13 07:45