处理新的Windows手机软件按钮(WinRT)

时间:2015-03-30 12:02:18

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

处理弹出覆盖我的应用内容的Windows手机软件按钮的最佳方法是什么。早期他们有这些硬件按钮(后退,Windows,搜索按钮)但现在在某些设备中他们已经引入了软件密钥。示例Lumia 730设备。

1 个答案:

答案 0 :(得分: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。

希望它有所帮助!