【问题标题】:Controlling Microsoft Charting Controls focus控制 Microsoft Charting Controls 焦点
【发布时间】:2017-07-31 14:58:54
【问题描述】:

我目前在我的一个 Windows 窗体中使用 MSCharts。 MSCharts 的一个古怪之处在于,除非图表具有焦点,否则您无法在图表中触发 MouseWheel 事件。为了解决这个问题,大多数人说应该在图表中添加MouseEnter 事件,然后在图表中添加Focus() 以允许触发MouseWheel 事件(参见此处:Enabling mouse wheel zooming in a Microsoft Chart Control)。

假设我打开了一个完全不同的窗口(称为Window A),它恰好部分位于我的图表前面(称为窗口是Window B)。如果我不小心将鼠标在Window B 中的图表上移动了 10 毫秒,Window B 将成为焦点,Window A 将被置于其后面,这非常令人沮丧。

我探索了不同的选择。

  • Window BTopMost 属性设置为true。这样做的问题是用户必须关闭窗口或将其最小化才能隐藏它。如果有很多窗口,它似乎和最初的问题一样令人沮丧。
  • 不是将MouseEnter 事件赋予Focus() 的能力,而是让MouseClickMouseHover 事件赋予Focus()MouseClick 的问题是用户总是必须先单击图表才能放大,这还不错,但可能很烦人。 MouseHover 可以,但是事件认为是悬停的时间真的很短。

最后,我想要它,以便我可以将鼠标放在图表上并滚动而无需执行任何操作(鼠标单击或其他任何操作)。除此之外,如果我不小心将鼠标移到它上面一秒钟,我不希望包含图表的表单将焦点移回它。

编辑:

似乎根据@TaW,图表不需要焦点来触发Window 10中的MouseWheel事件。不幸的是,Windows 7不是这种情况。

【问题讨论】:

  • 我目前在我的一个 Windows 窗体中使用 MSCharts。 MSCharts 的一个古怪之处在于,除非图表具有焦点,否则您无法在图表中触发 MouseWheel 事件。 我无法确认。 使用 Win10 我发现触发了 MouseWheel无论焦点在哪个控件或窗体上,只要鼠标悬停在图表上即可。 也没有 将焦点设置在图表上,打开表单。不确定其他 Windows 版本,但在当前的 W10 64 上一切都很好!

标签: c# mschart microsoft-chart-controls


【解决方案1】:

这可能看起来有点 hacky,但它在这种情况下有效:

这通过使用FindForm 方法来实现。直到现在我才知道这是一件事。你可以在这里阅读更多信息:https://msdn.microsoft.com/en-us/library/system.windows.forms.control.findform(v=vs.110).aspx

myChart.MouseEnter+= delegate(object sender, EventArgs args) //add a mouse enter event to your chart
{
    if (!chart.Focused) //if chart isn't focused
    {
        if (chart.FindForm().ContainsFocus) //check if the form the chart is in contains focus
            chart.Focus(); //if the chart isn't focused, but the form is focused, focus on the chart
    }
};

当您将鼠标移入图表时,这仍会为图表提供焦点,并且它不会允许包含图表的表单从您所在的表单中提取焦点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多