【问题标题】:WPF Window not following mouse when expanding扩展时WPF窗口不跟随鼠标
【发布时间】:2019-03-25 13:23:45
【问题描述】:

在一个新的空白 WPF 应用程序中,我注意到使用鼠标调整窗口大小无法正常工作。

当我缩小窗口时,它工作正常。但是当我展开它时,窗口不会跟随鼠标,直到我离开按钮,然后窗口突然跳到新的大小。

似乎如果我在展开时非常缓慢地移动光标,窗口会跟随光标;但比这快一点,它不再。

你可以在我录制的视频中看到这个问题here

我尝试了 .NET 版本 4.7.2、4.7.1 和 4.6。所有人都有同样的问题。

我已尝试查找此内容,但在任何地方都没有发现任何关于此问题的信息。有谁知道是什么原因造成的,如何解决?

这个问题有可能以某种方式与我的机器无关,因此是由框架本身以外的其他原因引起的。所以另一个相关的问题可能是其他人是否在新的 WPF 项目中看到这种行为。

更新:这是在新的空白 WPF 项目中看到的行为,完全没有代码更改。并且预期的行为显然是窗口在展开时跟随光标,就像它在收缩时一样。

更新 2: 正如@gore85 所提到的,这可能是 Windows 10 版本 1903 的问题。当我发布这个问题(现在已经发布)时,我正在使用 1903 内部预览版,他看到了更新到1903后还是一样。

【问题讨论】:

  • 我猜你在“离题”类别中获得了接近投票,因为你没有提供足够的信息来复制这个问题。
  • 如果它是在一个空白的 WPF 项目中,那么您对它与硬件相关的猜测可能是一个不错的猜测。在这种情况下,您的问题可能仍会吸引密切的投票,因为与硬件相关的问题通常也会作为“离题”而关闭。
  • 这几乎感觉像是一个视频驱动程序问题。在系统属性的“性能”部分下的“控制面板”中甚至还有一些选项可以在大小更改请求时完全启用/禁用窗口的这种“可见性”。 也就是说,我无法在我这边的全新 WPF 应用程序中重现,也无法在几个 .net 迭代中重现。
  • 我也有同样的问题。我将我的 Windows 从 1809 升级到 1903,我认为它与此有关。在我的 wpf 项目完美调整大小之前,但现在它与您的视频中显示的相同。
  • @gore85 嗯,这可能是有道理的。我在我的 PC 上使用 1903(当时的内部预览),我无法在运行 1809 的 PC 上自己复制这个问题。

标签: c# wpf


【解决方案1】:

现在有解决此问题的方法。

https://support.microsoft.com/en-us/help/4517211/windows-10-update-kb4517211

解决了调整 Windows Presentation Foundation (WPF) 大小的问题 应用程序;他们可能不会响应使用鼠标调整大小 直到您松开鼠标按钮。

这似乎源于错误的平板电脑输入支持。有人设计了a workaround(不使用更新):

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 });
                    }
                }
            }
        }

【讨论】:

  • 这是一种“修复”,会在未来几年对 Windows 进行其他更改时产生问题。因此,至少要以 Windows 版本为条件。但是我宁愿让应用程序显示一个明确的消息框,说明 wndowa 需要更新和解释方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 2021-11-11
  • 1970-01-01
  • 2023-04-08
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多