【问题标题】:handle the new windows phone software buttons (WinRT)处理新的 windows phone 软件按钮 (WinRT)
【发布时间】:2015-03-30 12:02:17
【问题描述】:

处理弹出覆盖我的应用程序内容的 windows phone 软件按钮的最佳方法是什么。以前他们有这些硬件按钮(返回、Windows、搜索按钮),但现在在某些设备中他们引入了软件键。例如 Lumia 730 设备。

【问题讨论】:

  • 处理?你想对他们做什么?另外,这真的应该用 WinRT 标记吗? Windows 手机无法在 WinRT 上运行。
  • 老兄,问题是当软件键(返回、Windows、搜索)在设备上可见时,它们会隐藏可能包含一些棘手元素的背景。
  • 查看 ScrollViewer msdn.microsoft.com/en-us/library/windows/apps/… 以确保您始终可以将控件保留在框架中。
  • 你能找到一个解决方案来根据虚拟键是否可见来调整应用视图大小吗?

标签: xaml windows-phone-8.1 winrt-xaml


【解决方案1】:

有两种方式:

1) 您可以使用

将应用或页面设置为自动调整布局
    Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().SetDesiredBoundsMode(Windows.UI.ViewManagement.ApplicationViewBoundsMode.UseVisible);

但是这样做,如果 ClosedDisplayMode 发生变化,AppBar 会影响布局...

2) 为了克服问题 1,我创建了以下帮助程序类,它通知是否显示软件按钮,并给出被软件按钮遮挡的页面高度。这使我可以调整仅受软件按钮影响/隐藏的页面内容。

/// <summary>
/// Handles software buttons events on Windows Phone
/// Use this to control to show occluded parts if software buttons are being shown
/// and Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().DesiredBoundsMode are set to "UseCoreWindow"
/// </summary>
public static class SoftwareButtonsHelper
{
    public delegate void SoftwareButtonsChangedDelegate(Visibility softwareButtonsVisibility, double diffSize);

    /// <summary>
    /// Raised when software buttons visibility changes
    /// </summary>
    public static event SoftwareButtonsChangedDelegate SoftwareButtonsChanged;

    /// <summary>
    /// Current window bottom size
    /// </summary>
    private static double currentBottonSize = 0.0;

    /// <summary>
    /// Are software buttons being monitored?
    /// </summary>
    public static bool Listening { get; private set; }

    /// <summary>
    /// Software buttons visibility
    /// </summary>
    public static Visibility SoftwareButtonsVisibility { get; private set; }

    /// <summary>
    /// Current page height that's being occluded
    /// </summary>
    public static double CurrentInvisibleDifference { get; private set; }

    /// <summary>
    /// Start listening for software buttons
    /// (event will raise if they appear/disappear)
    /// </summary>
    public static void Listen()
    {
        if (!Listening)
        {
            currentBottonSize = ApplicationView.GetForCurrentView().VisibleBounds.Bottom;
            ApplicationView.GetForCurrentView().VisibleBoundsChanged += (ApplicationView sender, object args) =>
            {
                if (currentBottonSize != ApplicationView.GetForCurrentView().VisibleBounds.Bottom)
                {
                    currentBottonSize = ApplicationView.GetForCurrentView().VisibleBounds.Bottom;

                    var currentPageAppBar = ((Window.Current.Content as Frame).Content as Page).BottomAppBar;
                    var isAppBarVisible = currentPageAppBar != null && currentPageAppBar.Visibility == Visibility.Visible;
                    var diff = Window.Current.Bounds.Bottom - currentBottonSize;
                    var diffAppBar = diff;
                    if (isAppBarVisible)
                    {
                        diffAppBar = Math.Round(diff - currentPageAppBar.Height);
                        diff = diffAppBar;
                    }
                    else
                    {
                        diff = Math.Round(diff);
                    }

                    if ((isAppBarVisible && diffAppBar == 0)
                    || (!isAppBarVisible && diff == 0))
                    {
                        // Either contents are visible or are occluded by app bar, do nothing..
                        OnSoftwareButtonsChanged(Visibility.Collapsed, diff);
                    }
                    else
                    {
                        // Software buttons are active...
                        OnSoftwareButtonsChanged(Visibility.Visible, diff);
                    }
                }
            };
            Listening = true;
        }
    }

    /// <summary>
    /// Raise event
    /// </summary>
    /// <param name="newVisibility"></param>
    /// <param name="difference"></param>
    private static void OnSoftwareButtonsChanged(Visibility newVisibility, double difference)
    {
        CurrentInvisibleDifference = difference;
        if (SoftwareButtonsVisibility != newVisibility)
        {
            SoftwareButtonsVisibility = newVisibility;
            if (SoftwareButtonsChanged != null)
            {
                SoftwareButtonsChanged(newVisibility, difference);
            }
        }
    }
}

您只需要调用 SoftwareButtonsHelper.Listen();之后 Window.Current.Activate();在 App.xaml.cs 上并在目标页面上订阅 SoftwareButtonsHelper.SoftwareButtonsChanged。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多