如何将选定的网格行/列置于窗口中心?

时间:2011-03-14 22:17:48

标签: c# wpf wpf-controls

我整个晚上都浪费了一些我认为非常简单的东西,但似乎WPF和谷歌让我完全失望。

我需要一个网格,其中6x6我用自定义控件填充每一行和每列。我希望能够通过键盘浏览此网格(我可以获得这些事件,没问题),但我似乎无法找到如何在窗口中心始终拥有所选的网格行/列。

我发现了一些类似旋转木马的实现,但是大多数只能在一个方向上工作,我想要双向导航,但似乎没有人支持这个,也不能扩展它们来做到这一点。

我基本上想要创建一个类似于PSP的网格导航。

1 个答案:

答案 0 :(得分:1)

一种简单的方法是:

  • 创建可滚动的表单。
  • 添加一个6x6网格的子控件。
  • 在所有控件的GotFocus(或类似)事件中,将父表单滚动偏移设置为适当的位置以使子项居中。

这是非常直接的实现,通过设置滚动偏移,可以通过一些数学计算如何将控件的x,y位置居中(这可能很棘手/混乱,但只要你了解用于滚动的坐标系,不是太糟糕)

或者,另一种避免通过Windows API滚动并使用自定义控件的方法:

  • 创建表单
  • 覆盖OnPaint以将6x6“控件”的网格绘制为以所选“控件”为中心的简单图形形状或位图图像。
  • 处理键盘(KeyDown / Up)和鼠标处理(MouseDown / Up)事件,使图形的36个区域以您希望的方式响应用户输入。您必须跟踪所选项目并强制窗口重绘其图形以显示新状态。启用双缓冲以阻止其闪烁。

第一种方法为您提供了大量基于Windows的免费处理(控件之间的标签,记住输入焦点的位置,以及将事件定向到每个“控件”的单独类)。第二种方法消除了所有这些“帮助”,但让你完全控制一切,这通常可以帮助避免意外的行为(例如,当用户按下Tab时它不会移动输入焦点,除非你专门编写代码使它做这一点)。