我刚从
Windows 7将PC移动到Windows 8,而在运行我们的WPF应用程序时,我注意到我们的WPF弹出窗口和/或工具提示现在位于左下方,而不是正常的右下角.有人注意到了吗?我知道你可以在xaml中的每个工具提示上指定他们的位置,但是我们有很多工具提示和弹出窗口.我想知道是否有办法在WPF应用程序中全局指定默认位置. Google在这个问题上没有得到很多结果.我们有理由将它们保持在相同的原始默认位置(某些弹出窗口的内容相对于其启动位置).
Windows 8:(左下)
Windows 7:(右下)
有任何想法吗?
好的,我发现了这个问题.它与平板电脑/触摸屏有关. (左手..右手偏好)这个其他链接提供了一个原因.我正在努力解决这个问题.不快发布细节!
好的,对于那些不希望在应用程序中发生这种情况的人(这是我们的愿望),我们为WPF创建了一个很好的小黑客.这对我们来说很好.
原文链接:https://www.f2er.com/windows/364087.html第一:
这个代码将会是什么运行,它修复了这个问题:
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)); }
就像这样完整的.我希望这有助于别人!