Управление фокусом Microsoft Charting Controls

В настоящее время я использую MSCharts в одной из моих оконных форм. Одна из причудливых особенностей MSCharts заключается в том, что вы не можете инициировать событие MouseWheel на диаграмме, если диаграмма не находится в фокусе. Чтобы бороться с этим, большинство людей говорят, что нужно добавить событие MouseEnter в диаграмму, а затем Focus() диаграмму, чтобы разрешить запуск событий MouseWheel (см. здесь: Включение масштабирования колесика мыши в Microsoft Chart Control).

Допустим, я открыл совершенно другое окно (назовем его Window A), которое оказалось частично перед моей диаграммой (назовем его окном Window B). Если я случайно наведу указатель мыши на график в Window B хотя бы на 10 миллисекунд, Window B получит фокус, а Window A окажется за ним, что невероятно неприятно.

Я изучил разные варианты.

  • Установка свойства TopMost Window B в значение true. Проблема в том, что пользователь должен либо закрыть окно, либо свернуть его, чтобы скрыть его. Если открыто много окон, это кажется таким же неприятным, как и первоначальная проблема.
  • Вместо того, чтобы давать событию MouseEnter возможность Focus(), пусть событие MouseClick или MouseHover будет Focus(). Проблема с MouseClick заключается в том, что пользователю всегда придется сначала щелкнуть диаграмму, чтобы увеличить ее, что неплохо, но может раздражать. MouseHover нормально, но время, которое событие считает зависанием, очень короткое.

В конце концов, я хочу, чтобы я мог наводить указатель мыши на график и прокручивать его без каких-либо действий (щелчков мыши или чего-либо еще). Вдобавок к этому я не хочу, чтобы форма, содержащая диаграмму, возвращала на нее фокус, если я случайно наведу на нее указатель мыши всего на секунду.

РЕДАКТИРОВАТЬ:

Похоже, что, согласно @TaW, диаграмме не требуется фокус для запуска событий MouseWheel в окне 10. К сожалению, это не так в Windows 7.


person john    schedule 31.07.2017    source источник
comment
В настоящее время я использую MSCharts в одной из своих оконных форм. Одна из странных особенностей MSCharts заключается в том, что вы не можете инициировать событие MouseWheel на диаграмме, если диаграмма не находится в фокусе. Я не могу это подтвердить. Используя Win10, я обнаружил, что MouseWheel запускается независимо от того, на каком элементе управления или форме находится фокус, пока мышь находится над диаграммой. Ни установка фокуса на диаграмму не вызовет отображение формы. Насчет других версий винды не уверен, но на текущей W10 64 все хорошо!   -  person TaW    schedule 31.07.2017


Ответы (1)


Это может показаться немного хакерским, но в данном случае это работает:

Это работает за счет использования метода 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
    }
};

Это по-прежнему будет придавать фокус диаграмме, когда вы наводите на нее указатель мыши, и это не позволит форме, содержащей диаграмму, сместить фокус с формы, в которой вы находитесь.

person john    schedule 31.07.2017