C# 使用箭头键滚动可滚动控件

C# 使用箭头键滚动可滚动控件,c#,winforms,scroll,scrollbar,C#,Winforms,Scroll,Scrollbar,我在C#项目中使用了一个ScrollableControl,我想知道如何将箭头键映射到垂直/水平滚动 编辑:我的图片框获得焦点,我设法将按键映射到滚动。这里的问题是,当我按下箭头键时,它会滚动一次,然后失去焦点,将其交给Scrollviewer旁边的按钮。我希望scrollviewer不要失去焦点 这是我的代码,第二段是这里有趣的一段 private void drawMap(IGame game) { System.Windows.Forms.PictureBox pictureBox

我在C#项目中使用了一个
ScrollableControl
,我想知道如何将箭头键映射到垂直/水平滚动

编辑:我的图片框获得焦点,我设法将按键映射到滚动。这里的问题是,当我按下箭头键时,它会滚动一次,然后失去焦点,将其交给Scrollviewer旁边的按钮。我希望scrollviewer不要失去焦点

这是我的代码,第二段是这里有趣的一段

private void drawMap(IGame game)
{
    System.Windows.Forms.PictureBox pictureBox = new System.Windows.Forms.PictureBox();
    pictureBox.Width = (int)Math.Sqrt((double)game.Map.grid.Count) * 50; pictureBox.Height = (int)Math.Sqrt((double)game.Map.grid.Count) * 50;
    pictureBox.Paint += new System.Windows.Forms.PaintEventHandler(game.Map.afficher);
    pictureBox.MouseEnter += pictureBoxFocus;
    pictureBox.Click += pictureBoxFocus;
    pictureBox.Click += mapClicked;

    System.Windows.Forms.ScrollableControl sc = new System.Windows.Forms.ScrollableControl();
    sc.Controls.Add(pictureBox);
    sc.AutoScroll = true;
    windowsFormsHost1.Child = sc;
}
提前感谢:)

另外:我的滚动算法有点脏,工作不太好,所以我想知道是否有一个“简单的方法”来做到这一点

private void sc_PreviewKeyDown(object sender, System.Windows.Forms.PreviewKeyDownEventArgs e)
{
    System.Windows.Forms.ScrollableControl sc = (System.Windows.Forms.ScrollableControl)sender;
    switch (e.KeyValue)
    {
        case (int)System.Windows.Forms.Keys.Down:
            sc.VerticalScroll.Value += 50;
            break;
        case (int)System.Windows.Forms.Keys.Up:
            if(sc.VerticalScroll.Value - 50 < 0)
                sc.VerticalScroll.Value = 0;
            else sc.VerticalScroll.Value -= 50;
            break;
        case (int)System.Windows.Forms.Keys.Right:
            sc.HorizontalScroll.Value += 50;
            break;
        case (int)System.Windows.Forms.Keys.Left:
            if (sc.HorizontalScroll.Value - 50 < 0)
                sc.HorizontalScroll.Value = 0;
            else sc.HorizontalScroll.Value -= 50;
            break;
    }
    windowsFormsHost1.Child.Focus();
}
private void sc_PreviewKeyDown(对象发送方,System.Windows.Forms.PreviewKeyDownEventArgs e)
{
System.Windows.Forms.ScrollableControl sc=(System.Windows.Forms.ScrollableControl)发送方;
开关(如键值)
{
大小写(int)System.Windows.Forms.Keys.Down:
sc.VerticalScroll.Value+=50;
打破
案例(int)System.Windows.Forms.Keys.Up:
如果(sc.VerticalScroll.Value-50<0)
sc.VerticalScroll.Value=0;
else sc.VerticalScroll.Value-=50;
打破
case(int)System.Windows.Forms.Keys.Right:
sc.HorizontalScroll.Value+=50;
打破
大小写(int)System.Windows.Forms.Keys.Left:
如果(sc.HorizontalScroll.Value-50<0)
sc.HorizontalScroll.Value=0;
else sc.HorizontalScroll.Value-=50;
打破
}
windowsFormsHost1.Child.Focus();
}

您尝试过什么?您是否在捕捉箭头键或调用滚动时遇到问题?您没有任何可以接收焦点的控件。因此,您将永远无法让他们响应击键。您需要通过创建一个更智能的控件来解决这个问题,该控件可以接收焦点并响应击键。Hm my picture box的可能副本可以获得焦点,我成功地将按键映射到滚动。这里的问题是,当我按下箭头键时,它会滚动一次,然后失去焦点,将其交给Scrollviewer旁边的按钮。我希望scrollviewer不要丢失焦点是的,光标键将焦点移动到下一个控件。您忘记将e.IsInputKey设置为true以防止发生这种情况。