C# 如何相对于所选按钮更改上、下、左、右按钮的焦点?
我是编程新手 我不知道怎么解释好 如何使我的WinForms应用程序理解按钮位置, 例如,假设放置了许多按钮,其中一个是select 按钮1-按钮2-按钮3 按钮4-(按钮5)-按钮6 按钮7-按钮8-按钮9 如何按下键盘并跳转到(按钮8)和不跳转到(按钮6),或按向上键并从(按钮2)跳转。C# 如何相对于所选按钮更改上、下、左、右按钮的焦点?,c#,winforms,C#,Winforms,我是编程新手 我不知道怎么解释好 如何使我的WinForms应用程序理解按钮位置, 例如,假设放置了许多按钮,其中一个是select 按钮1-按钮2-按钮3 按钮4-(按钮5)-按钮6 按钮7-按钮8-按钮9 如何按下键盘并跳转到(按钮8)和不跳转到(按钮6),或按向上键并从(按钮2)跳转。 如何让visual studio了解哪个按钮相对于所选按钮是向上还是向下或向左和向右的?我假设您所说的是表单中的按钮 把它们放在这样的列表中 List<Button> buttons = new
如何让visual studio了解哪个按钮相对于所选按钮是向上还是向下或向左和向右的?我假设您所说的是表单中的按钮 把它们放在这样的列表中
List<Button> buttons = new List<Button>() {Button1, Button2...}
List buttons=new List(){Button1,Button2…}
现在你知道了你正在使用的按钮,上升意味着你需要获取当前索引并从中减去3*(Button6->Button3),然后将其用作列表的新索引。
对于down,您添加3*,左/右为负/正1
现在,您只需定义边缘情况:
当你按下按钮9时,如果按下向下或向右怎么办
*此值根据列的数量而更改。3列=>+/-3;4列=>+/-4
您可以将按钮添加到,因此每个按钮的位置由TableLayoutPanel的(
列:行
)坐标确定
- 创建一个TableLayoutPanel(在下面,名为
),其中有足够的行和列来容纳按钮。如果需要,可以在运行时添加/删除行和列tlpButtons
- 选择所有按钮并使用表单设计器中的PropertyGrid订阅,以便所有按钮都只有一个事件处理程序(在此代码中,事件处理程序名为
)按钮\u PreviewKeyDown
- 当按下
或键.Up
时,将调用按钮的键.Down
处理程序。sender参数引用触发事件的控件,因此我们将PreviewKeyDown
强制转换为sender
(因为只需要控件类型引用,所以我们不使用特定于派生类型的任何属性,如控件
)按钮
- 如果我们处理按下的键,我们必须设置,否则事件将传递给控件并进行处理(导致触发正常选择)
- TableLayoutPanel返回此控件的行/列位置
- 我们只需设置行值
,具体取决于按下的光标键(同时检查新值是否在±1
范围内)。[0:rowscont]
该方法返回控件在新位置的引用:我们使用该引用设置当前位置
注:
按钮\u PreviewKeyDown
事件处理程序对于所有按钮/控件都是相同的。tlpButtons
是用作按钮/控件容器的TableLayoutControl的名称
更新为在激活或不激活时也使用数字键盘
private void按钮\u PreviewKeyDown(对象发送方,PreviewKeyDown事件参数e)
{
var btn=发送方作为控制;
var pos=tlpButtons.GetPositionFromControl(btn);
bool-moveFocus=false;
开关(如钥匙代码){
case key.NumPad8:
案例密钥。向上:
位置行=(位置行>0)?位置行-1:tlpButtons.RowCount-1;
moveFocus=true;
打破
case Keys.NumPad2:
案例键。向下:
位置行=(位置行<(tlpButtons.RowCount-1))?位置行+1:0;
moveFocus=true;
打破
case Keys.numpa4:
如果(位置列>0){
位置列-=1;
}
否则{
pos.Column=tlpButtons.ColumnCount-1;
位置行=位置行>0?位置行-1:tlpButtons.RowCount-1;
}
moveFocus=true;
打破
case Keys.NumPad6:
如果(位置列<(tlpButtons.ColumnCount-1)){
位置列+=1;
}
否则{
位置列=0;
位置行=(位置行
我不明白。这与Visual Studio有什么关系?你在说什么按钮?在VisualStudio中?在窗体设计器中?在WPF中?WebForms?它是windows窗体,我正在尝试用visual studio制作GUI,好吧,你不想visual studio“理解它”,你想让你的应用程序做点什么。覆盖表单的“OnKeyDown”,处理Keys.Down键,然后您可以实现一些逻辑“如果当前按钮=5且Key=Down,则选择8”。当然,后者需要一些系统性,但首先要做的是事件处理。你可能可以修改这个问题的答案,让它使用按钮而不是文本框。我认为这个概念是一样的。应该注意的是,这只适用于OP指定的列的精确配置。如果他们添加了一个新的列,那么数学将需要修改。这是正确的,我添加了一个注释来反映这个问题PO-new List(新列表
private void buttons_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
var btn = sender as Control;
var pos = tlpButtons.GetPositionFromControl(btn);
bool moveFocus = false;
switch (e.KeyCode) {
case Keys.NumPad8:
case Keys.Up:
pos.Row = (pos.Row > 0) ? pos.Row - 1 : tlpButtons.RowCount - 1;
moveFocus = true;
break;
case Keys.NumPad2:
case Keys.Down:
pos.Row = (pos.Row < (tlpButtons.RowCount - 1)) ? pos.Row + 1 : 0;
moveFocus = true;
break;
case Keys.NumPad4:
if (pos.Column > 0) {
pos.Column -= 1;
}
else {
pos.Column = tlpButtons.ColumnCount - 1;
pos.Row = pos.Row > 0 ? pos.Row - 1 : tlpButtons.RowCount - 1;
}
moveFocus = true;
break;
case Keys.NumPad6:
if (pos.Column < (tlpButtons.ColumnCount - 1)) {
pos.Column += 1;
}
else {
pos.Column = 0;
pos.Row = (pos.Row < tlpButtons.RowCount - 1) ? pos.Row + 1 : 0;
}
moveFocus = true;
break;
}
if (moveFocus) {
e.IsInputKey = true;
var ctrl = tlpButtons.GetControlFromPosition(pos.Column, pos.Row);
if (ctrl != null) this.ActiveControl = ctrl;
}
}