代码之家  ›  专栏  ›  技术社区  ›  Pat

使用方向键在画布内移动控件

  •  2
  • Pat  · 技术社区  · 15 年前

    在画布元素中有许多控件,我希望能够使用箭头/方向键(上、下、左、右)将它们移到画布中。在WPF/code-behind中,最简单的方法是什么?有没有一种惯用的WPF方法来做这个?

    我想我应该澄清一下:我希望能够独立地移动每个控件;我不希望同时移动所有控件。

    6 回复  |  直到 15 年前
        1
  •  4
  •   mdm20    15 年前

    以下是我的解决方案:

    EventManager.RegisterClassHandler(typeof(MainWindow), UIElement.KeyDownEvent, new KeyEventHandler(KeyDownHandler));
    

    然后找出是谁发送了事件并相应地移动它。

    void KeyDownHandler(object sender, KeyEventArgs e)
    {
        UIElement element = e.OriginalSource as UIElement;
        if (element != null)
        {
            double left = Canvas.GetLeft(element);
            if (Double.IsNaN(left)) left = 0;
            double top = Canvas.GetTop(element);
            if (Double.IsNaN(top)) top = 0;
    
            switch (e.Key)
            {
                case Key.Left: left--; break;
                case Key.Right: left++; break;
                case Key.Up: top--; break;
                case Key.Down: top++; break;
            }
    
             Canvas.SetLeft(element, left);
             Canvas.SetTop(element, top);
        }
        e.Handled = true;
    }
    
        2
  •  1
  •   steinar Justin CI    15 年前

    我可以这样做:

    :现在只移动带焦点的窗口(并停止窗口进一步处理事件)。

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        int deltaX = 0, deltaY = 0;
    
        if (e.Key == Key.Left)
        {
            deltaX = -1;
        }
        else if (e.Key == Key.Right)
        {
            deltaX = 1;
        }
        else if (e.Key == Key.Up)
        {
            deltaY = -1;
        }
        else if (e.Key == Key.Down)
        {
            deltaY = 1;
        }
    
        foreach (UIElement element in this.canvas1.Children)
        {
            if (element.IsFocused)
            {
                double left = (double)element.GetValue(Canvas.LeftProperty);
                element.SetValue(Canvas.LeftProperty, left + deltaX);
    
                double top = (double)element.GetValue(Canvas.TopProperty);
                element.SetValue(Canvas.TopProperty, top + deltaY);                                             
            }            
        }
        e.Handled = true;
    }
    
        3
  •  1
  •   Pat    15 年前

    public CanvasControlArrowKeyTest()
    {
        InitializeComponent();
    
        EventManager.RegisterClassHandler(typeof(Window), UIElement.KeyDownEvent, new KeyEventHandler(HandleKeyDown));
    }
    
    private void HandleKeyDown(object sender, KeyEventArgs e)
    {
        UIElement element = e.OriginalSource as UIElement;
        if (element != null)
        {
            double left = Canvas.GetLeft(element);
            if (Double.IsNaN(left)) left = 0;
            double top = Canvas.GetTop(element);
            if (Double.IsNaN(top)) top = 0;
    
            switch (e.Key)
            {
                case Key.Left: left--; break;
                case Key.Right: left++; break;
                case Key.Up: top--; break;
                case Key.Down: top++; break;
                default: return;
            }
    
            if (left < 0) left = 0;
            if (top < 0) top = 0;
    
            Canvas.SetLeft(element, left);
            Canvas.SetTop(element, top);
            e.Handled = true;
        }
    }
    

    作为参考,这里是XAML:

    <Window x:Class="DiagramDesigner.CanvasControlArrowKeyTest"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            Title="CanvasControlArrowKeyTest" Height="300" Width="300">
        <Canvas>
            <Canvas.Resources>
                <Style TargetType="Button">
                    <Setter Property="Width" Value="50" />
                    <Setter Property="Height" Value="50" />
                    <Setter Property="Background" Value="Black"/>
                </Style>
            </Canvas.Resources>
            <Button />
            <Button />
        </Canvas>
    </Window>
    
        4
  •  0
  •   Pavan R Bhupalam    12 年前
            if (e.keycode == keys.right)
            {
                rectangle2.left = rectangle2.left + 25;
                ellipse1.left = ellipse1.left + 25;
            }
    
           else if (e.keycode == keys.left)
            {
                rectangle2.left = rectangle2.left - 25;
                ellipse1.left = ellipse1.left - 25;
            }
    
        5
  •  -1
  •   Punithsuresh    12 年前

    if(Canvas.TopProperty==IsActiveProperty)
                    {
                    Canvas.SetLeft(ellipse1,l-20);
                    }
    
        6
  •  -2
  •   Pavan R Bhupalam    12 年前

    要移动矩形和椭圆,请使用此。。。

    <Window x:Class="Wpf_Game.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Shootings" Height="700" Width="900" KeyDown="Window_KeyDown" KeyUp="Window_KeyUp">
    
    
    
    
    private void Window_KeyUp(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Left)
                {
                    var l = Canvas.GetLeft(rectangle1);
                    Canvas.SetLeft(rectangle1,l-20);
                    Canvas.SetLeft(ellipse1,l-20);
                }
                else if (e.Key == Key.Right)
                {
                    var l = Canvas.GetLeft(rectangle1);                
                    Canvas.SetLeft(rectangle1, l + 20);
                    Canvas.SetLeft(ellipse1, l + 20);
    
                }
                else if (e.Key == Key.Enter)
                {
                    Canvas.SetTop(ellipse1,05);
                }
            }