【问题标题】:Control.Capture is always true?Control.Capture 总是正确的?
【发布时间】:2016-08-17 15:07:26
【问题描述】:

我创建了一个 Windows 窗体应用程序,但我从控件的 Capture 属性中得到了奇怪的行为。

在一个空白表单上,带有一个名为“label1”的标签和代码

public Form1()
{
    InitializeComponent();

    label1.MouseDown += pictureBox1_MouseDown;
}

void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    Debug.WriteLine(label1.Capture);
    label1.Capture = !label1.Capture;
    Debug.WriteLine(label1.Capture);
} 

我观察到,当单击按钮时,第一个 WriteLine 总是说“True”,第二个总是说“False”。即使多次点击。

标签永远不会对其边界外的点击做出反应,即使我使用 label1.Capture = true 代替。

我是否误解了“捕获”属性的预期行为?我希望初始值为 false,并且标签不会对外部点击做出反应,在第一次点击后,我希望该值是 true,并且标签会对所有鼠标点击做出反应,即使在其边界之外。

【问题讨论】:

  • 对两个控件使用相同的事件处理程序很容易造成混淆。当您单击标签时,您肯定会得到 True。当然,当您单击图片框时为 False。 Winforms 使用 Capture 属性可靠地生成 Click 事件并在触发 MouseDown 事件之前将其打开。这是必要的,因此当您将鼠标拖到控件边界之外后释放鼠标时,not 会引发 Click 事件。自己使用 Capture 属性(如“对外部点击做出反应”)不太可能奏效。

标签: c# winforms


【解决方案1】:

MouseDown 事件中,控件的Capture 最初始终设置为true。所以通常如果你执行MouseDown然后不释放鼠标按钮将鼠标移出控件然后释放鼠标按钮,控件的MouseUp事件将被触发。

如果您在MouseDown 中将Capture 设置为false,则只有当鼠标悬停在控件上并且将鼠标移出控件然后释放鼠标时,才会触发控件的鼠标向上事件按钮,您的控件的MouseUp 事件将不会引发。

同样在MouseUp 中,捕获将被自动释放。

有关更多信息,请查看以下资源:

【讨论】:

  • 谢谢。我来自 WPF,处理方式不同。
猜你喜欢
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多