处理弹出覆盖我的应用内容的Windows手机软件按钮的最佳方法是什么。早期他们有这些硬件按钮(后退,Windows,搜索按钮)但现在在某些设备中他们已经引入了软件密钥。示例Lumia 730设备。
答案 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。
希望它有所帮助!