控制Microsoft Charting Controls焦点

时间:2017-07-31 14:58:55

标签: c# mschart microsoft-chart-controls

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

我们说我拉出了一个完全不同的窗口(称之为Window B),恰好位于我的图表前面(称之为Window B)。如果我意外地将鼠标移动到Window B中的图表上甚至10毫秒,Window A将获得焦点,Window B将被置于其后面,这非常令人沮丧。

我已经探索了不同的选择。

  • TopMost' s MouseEnter属性设置为true。这个问题是用户必须关闭窗口或将其最小化以隐藏它。如果有很多窗口,它似乎和最初的问题一样令人沮丧。
  • 不要让Focus()事件能够MouseClick,而是将MouseHoverFocus()事件发送到MouseClick。问题MouseHover是用户必须首先点击图表进行缩放,这不是很糟糕,但可能很烦人。 MouseWheel没问题,但事件认为是悬停的时间非常短暂。

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

编辑:

根据@TaW的说法,图表似乎并不需要关注触发窗口10中的Message::with([ 'last_sender' => function($q) use ($userId = Auth::user()->id) { $q->where('id','!=',$userId) } ])->get(); 事件。不幸的是,Windows 7并非如此。

1 个答案:

答案 0 :(得分:0)

这可能看起来有点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
    }
};

当您将鼠标移动到图表中时,这仍然会使图表成为焦点,并且不允许包含图表的表单从您正在处理的表单中获取焦点。