Как центрировать выбранную строку / столбец сетки в центре окна? - PullRequest
0 голосов
/ 15 марта 2011

Я просто потратил весь вечер на что-то, что, на мой взгляд, было бы очень просто, но, похоже, WPF и Google полностью меня подводят.

Мне нужна сетка, 6x6 из которых я заполняю каждую строку и столбец с помощью пользовательского элемента управления. Я хочу иметь возможность перемещаться по этой сетке через клавиатуру (я могу получить эти события, нет проблем), но я не могу найти, как я всегда могу иметь выбранную строку / столбец сетки в центре моего окна.

Я нашел несколько реализаций, похожих на карусели, но большинство из них работают только в одном направлении, и мне нужна двухсторонняя навигация, но, похоже, никто не поддерживает это, и я не могу расширить их для этого.

Я хочу создать навигацию по сетке PSP.

1 Ответ

1 голос
/ 15 марта 2011

Один простой способ сделать это:

  • Создание прокручиваемой формы.
  • Добавление сетки дочерних элементов управления 6x6.
  • В событии GotFocus (или аналогичном) для всех элементов управления установите смещение прокрутки родительской формы в соответствующую позицию для центрирования дочернего элемента.

Это довольно простая вещь для реализации, с небольшим количеством математики, чтобы понять, как центрировать x, y позицию элемента управления, установив смещения прокрутки (это может быть сложно / запутанно, но пока Вы понимаете, системы координат, используемые для прокрутки, не так уж плохо)

Или другой подход, позволяющий избежать прокрутки через API Windows и использования пользовательских элементов управления:

  • Создать форму
  • Переопределите OnPaint, чтобы нарисовать вашу сетку из 6x6 «элементов управления» в виде простых графических фигур или растровых изображений с центром в выбранном «элементе управления».
  • Обрабатывайте события клавиатуры (KeyDown / Up) и мыши (MouseDown / Up), чтобы заставить 36 областей графики реагировать на пользовательские вводы так, как вы хотите. Вам нужно будет отследить выбранный элемент и заставить окно перерисовать его графику, чтобы показать новое состояние. Включите двойную буферизацию, чтобы она перестала мигать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...