Как сделать чтобы действие выполнялось пока удерживается кнопка на Canvas?

Для достижения такого поведения, вам потребуется использовать события мыши и ключей в C# и Windows Forms, а также определить обработчики событий для Canvas.

1. Создайте новую форму Windows Forms и добавьте на нее элемент управления Canvas. Для этого перетащите элемент управления Canvas из панели инструментов в окно формы.
2. Добавьте обработчики событий мыши и клавиш. Для события нажатия и отпускания кнопки мыши используйте события MouseDown и MouseUp для Canvas. Для события удержания клавиши используйте событие KeyDown.
3. В обработчике события MouseDown установите флаг, указывающий, что кнопка была нажата и она должна быть удерживаема. В обработчике MouseUp сбросьте этот флаг.
4. В методе Form_Load создайте таймер, который будет вызывать метод, выполняющий желаемое действие, пока флаг, устанавливаемый в событии MouseDown, не будет сброшен в событии MouseUp.
5. В обработчике KeyDown проверьте, была ли нажата кнопка, которая установлена для удержания кнопки мыши на Canvas. Если да, то установите флаг, указывающий, что кнопка мыши была нажата и должна быть удерживаема.
6. В обработчике KeyUp проверьте, была ли отпущена кнопка клавиши, установленная для удержания кнопки мыши на Canvas. Если да, сбросьте флаг.

В итоге, когда вы удерживаете кнопку мыши на Canvas или клавишу на клавиатуре, будет выполняться желаемое действие. Когда кнопка мыши или клавиша отпускается, действие прекращается.

Пример кода для реализации описанной логики может выглядеть примерно так:

public partial class Form1 : Form
{
    private bool canvasButtonPressed = false;
    private bool keyboardButtonPressed = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Timer timer = new Timer();
        timer.Interval = 100; // Интервал таймера - 100 миллисекунд
        timer.Tick += Timer_Tick;
        timer.Start();
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        if (canvasButtonPressed || keyboardButtonPressed)
        {
            // Выполнение желаемого действия
        }
    }

    private void canvas_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            canvasButtonPressed = true;
        }
    }

    private void canvas_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            canvasButtonPressed = false;
        }
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Space)
        {
            keyboardButtonPressed = true;
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Space)
        {
            keyboardButtonPressed = false;
        }
    }
}

В этом примере мы создаем форму с элементом управления Canvas и устанавливаем обработчики событий MouseDown, MouseUp, KeyDown и KeyUp для кнопки мыши на Canvas и для клавиш в целом. В методе Timer_Tick выполняем желаемое действие, если кнопка мыши или клавиша удерживается.