为什么自Windows 10(1809/1903)以来,我的所有WPF应用程序都无法将其拖动到窗口之外,例如调整窗口大小或拖放?

时间:2019-05-29 06:42:24

标签: wpf windows-10

总有一天,我发现我所有的WPF应用程序都无法将其拖动到窗口之外,并且无法使用实时预览来调整任何窗口的大小。

我的问题是为什么会发生这种情况,我该如何解决?


您可以查看下面显示的动画图像:

Cannot resize outside the window

Visual Studio resizing demo

您会注意到,当我的光标在窗口之外时,调整大小会立即停止,并且当光标第一次离开窗口时,窗口会保持大小。如果光标重新进入窗口区域,则窗口大小将恢复。

不仅我编写的所有WPF应用程序,而且其他WPF应用程序都复制:

  • Visual Studio 2017/2019年
  • 窥探
  • ScreenToGif
  • 等等。

非WPF应用程序正常运行。

这种现象发生在几个月前,因为我的系统版本是Windows 10(1809),而现在我的系统版本是Windows 10(1903),此问题仍然存在。从.NET Framework 3.5 / 4.5 / 4.8和.NET Core 3.0嵌入的WPF应用程序。


Update1 :我刚刚清理了所有驱动器,并使用一些核心应用程序重新安装了Windows 10 Professional(1903,客户版本),该问题仍然存在。核心应用程序是Chrome,PalmInput IME和iTunes。

Update2 :我已经编写了一个WPF应用程序来处理窗口消息。我发现49757消息在调整窗口外部大小时将停止接收。该消息在我朋友的系统上正常运行。

1 个答案:

答案 0 :(得分:0)

更新

WPF团队成员

As pointed out建议在WPF中禁用手写笔和触摸支持的推荐方法是使用Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport中的App.config设置,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true" />
  </runtime>  
</configuration>

还请注意,这不是解决方案,而是解决方法,可能并不适合所有情况。

原始

Markus Eisenstöck找到了此问题的work around。通过在WPF中禁用平板电脑支持,您将体验到预期的行为。我已经测试过,并且可以在我的机器上运行(Windows 10版本1903和.NET Framework 4.6.2):

public static void DisableWpfTabletSupport()
{
    // Get a collection of the tablet devices for this window.    
    TabletDeviceCollection devices = System.Windows.Input.Tablet.TabletDevices;


    if (devices.Count > 0)
    {
        // Get the Type of InputManager.  
        Type inputManagerType = typeof(System.Windows.Input.InputManager);


        // Call the StylusLogic method on the InputManager.Current instance.  
        object stylusLogic = inputManagerType.InvokeMember("StylusLogic",
                    BindingFlags.GetProperty | BindingFlags.Instance | 
                    BindingFlags.NonPublic,
                    null, InputManager.Current, null);


        if (stylusLogic != null)
        {
            // Get the type of the stylusLogic returned 
            // from the call to StylusLogic.  
            Type stylusLogicType = stylusLogic.GetType();


            // Loop until there are no more devices to remove.  
            while (devices.Count > 0)
            {
                // Remove the first tablet device in the devices collection.  
                stylusLogicType.InvokeMember("OnTabletRemoved",
                        BindingFlags.InvokeMethod | 
                        BindingFlags.Instance | BindingFlags.NonPublic,
                        null, stylusLogic, new object[] { (uint)0 });
            }
        }
    }
}