.net – WPF Handyness与弹出窗口

前端之家收集整理的这篇文章主要介绍了.net – WPF Handyness与弹出窗口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚从 Windows 7将PC移动到Windows 8,而在运行我们的WPF应用程序时,我注意到我们的WPF弹出窗口和/或工具提示现在位于左下方,而不是正常的右下角.有人注意到了吗?我知道你可以在xaml中的每个工具提示上指定他们的位置,但是我们有很多工具提示和弹出窗口.我想知道是否有办法在WPF应用程序中全局指定默认位置. Google在这个问题上没有得到很多结果.我们有理由将它们保持在相同的原始默认位置(某些弹出窗口的内容相对于其启动位置).

Windows 8:(左下)

Windows 7:(右下)

相同的代码!标准的“工具提示”xaml属性.

有任何想法吗?

解决,我发表了评论

好的,我发现了这个问题.它与平板电脑/触摸屏有关. (左手..右手偏好)这个其他链接提供了一个原因.我正在努力解决这个问题.不快发布细节!

windows 8 popup location

好的,对于那些不希望在应用程序中发生这种情况的人(这是我们的愿望),我们为WPF创建了一个很好的小黑客.这对我们来说很好.

第一:

这个代码将会是什么运行,它修复了这个问题:

public static void SetAlignment()
{
    var ifLeft = SystemParameters.MenuDropAlignment;

    if (ifLeft)
    {
        // change to false
        var t = typeof(SystemParameters);
        var field = t.GetField("_menuDropAlignment",BindingFlags.NonPublic | BindingFlags.Static);
        field.SetValue(null,false);

        ifLeft = SystemParameters.MenuDropAlignment;
    }
}

然而,环境可以解除微软内部缓存的这些值,所以我们必须挂钩到WinProc才能得到这个.我不会发布WinProc代码,只需要消息:

这些是将取消验证内部缓存的Win32消息:

private const int WM_WININICHANGE = 0x001A;
private const int WM_DEVICECHANGE = 0x219;
private const int WM_DISPLAYCHANGE = 0x7E;
private const int WM_THEMECHANGED = 0x031A;
private const int WM_SYSCOLORCHANGE = 0x15;

快速的snippit,将设置您的偏好.因为我们被连接到WinProc,所以在WinProc在其他处理程序上完成消息之后,您将需要更改此值.我们有一个延迟将偏好值重新设置回我们想要的.

if (msg == WM_WININICHANGE || msg == WM_DEVICECHANGE || msg == WM_DISPLAYCHANGE || msg == WM_THEMECHANGED || msg == WM_SYSCOLORCHANGE)
{
    Timer timer = null;
    timer = new Timer((x) =>
        {
            WpfHelperHacks.SetAlignment();
            timer.Dispose();
        },null,TimeSpan.FromMilliseconds(2),TimeSpan.FromMilliseconds(-1));
}

就像这样完整的.我希望这有助于别人!

原文链接:https://www.f2er.com/windows/364087.html

猜你在找的Windows相关文章