好的,对于那些不希望在他们的应用程序中出现这种情况的人(这也是我们的愿望),我们为WPF创建了一个不错的小技巧。这对我们来说效果很好。
首先:
这段代码将运行以解决该问题:
public static void SetAlignment()
{
var ifLeft = SystemParameters.MenuDropAlignment;
if (ifLeft)
{
var t = typeof(SystemParameters);
var field = t.GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
field.SetValue(null, false);
ifLeft = SystemParameters.MenuDropAlignment;
}
}
然而,环境可能会使 Microsoft 的这些值的内部缓存失效,因此我们必须钩取 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;
以下是能够将您的首选项还原的快速代码片段。由于我们被钩入到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));
}
就这样,它完成了。希望这能帮助其他人!