Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 15.10.2012, 19:56   #1
Lexa_kltn
Новичок
Джуниор
 
Регистрация: 15.05.2011
Сообщений: 2
По умолчанию Проблемы с обработкой событий мыши C# WPF

Доброго времени суток!
Проблема в следующем: пытаюсь сделать рисование отрезков мышью на Canvas. Все бы ничего, но события MouseDown, MouseUp не вызываются. Пробовал делать обработку в PreviewMouseDown и PreviewMouseUp, та же фигня - не вызываются. Нашел решение с InkCanvas, там PreviewMouseDown срабатывает, но отпускание кнопки мыши остается без внимания (не срабатывает).
Куда копать? Кто не пускает события? Что надо сделать, чтобы события мыши стали нормально отрабатываться? Заранее благодарен за помощь.

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Test
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        enum btnChanged {nothing, btnLine, btnRect};

        Point pN, pK;
        bool isMove = false;
        btnChanged btn = btnChanged.nothing;
 
        public MainWindow()
        {
            InitializeComponent();
        }

        private void LineBtnClick(object sender, RoutedEventArgs e)
        {
            btn = btnChanged.btnLine;
        }

        private void myCanvas_MouseDown(object sender, MouseButtonEventArgs e)
        {
            pN = Mouse.GetPosition(myCanvas);
            //pK = pN;
            //if (btn == btnChanged.btnLine)
            //DrawLine(pN, pK, true);
        }

        private void myCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
                if (btn == btnChanged.btnLine)
                {
               // DrawLine(pN, pK, true);
                Point p = Mouse.GetPosition(myCanvas);
                DrawLine(pN, p, true);
            }
        }

        private void myCanvas_MouseUp(object sender, MouseButtonEventArgs e)
        {
            pK = Mouse.GetPosition(myCanvas);
            if (btn == btnChanged.btnLine)
            {
                DrawLine(pN, pK, false);
                isMove = true;
            }
        }

        private void DrawLine(Point start, Point stop, bool move) 
        {
            Line line = new Line();
            line.Stroke = Brushes.Black;
            line.X1 = start.X;
            line.X2 = stop.X;
            line.Y1 = start.Y;
            line.Y2 = stop.Y;
            if (!move)
                myCanvas.Children.Add(line);
            else
                if (myCanvas.Children.Count > 2 && !isMove)
                {
                    myCanvas.Children.RemoveAt(myCanvas.Children.Count - 1);
                    myCanvas.Children.Add(line);
                }
                else
                {
                    myCanvas.Children.Add(line);
                    isMove = false;
                }
        }

        private void DrawRectangle(Point start, Point stop) 
        {
            Rectangle rectangle = new Rectangle();
            rectangle.Stroke = Brushes.Aqua;
            rectangle.Height = 100;
        }

        private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
        {
           if (myCanvas.Width < Width)
               myCanvas.Width = Width;
        }

        private void Window_StateChanged(object sender, EventArgs e)
        {
            if (this.WindowState == WindowState.Maximized)
                myCanvas.Width = this.myWind.ActualWidth;
        }
    }
}
и еще вот это:

Код:
<Window x:Class="Test.MainWindow" x:Name="myWind"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Test task" Height="350" SizeChanged="Window_SizeChanged" SizeToContent="Manual" StateChanged="Window_StateChanged" Width="525">
    <Grid x:Name="myGrid" Background="Bisque">
        <InkCanvas Name="myCanvas" Margin="100,0,0,0" MouseMove="myCanvas_MouseMove"  EditingMode="None" MoveEnabled="True" PreviewMouseDown="myCanvas_MouseDown" PreviewMouseUp="myCanvas_MouseUp">
        </InkCanvas>
        <ToolBar Width="100" Margin="0,0,0,0" HorizontalAlignment="Left">
            <RadioButton Name="lineBtn" Margin="15,10,5,5" VerticalAlignment="Top" HorizontalAlignment="Stretch" Padding="3" Click="LineBtnClick"> Line </RadioButton>
            <RadioButton Name="rectBtn" Margin="-45,40,5,5" VerticalAlignment="Top" HorizontalAlignment="Stretch" Padding="3"> Rectangle</RadioButton>
        </ToolBar>
    </Grid>
</Window>
Lexa_kltn вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать выполнение событий по щелчку мыши? Микура Visual C++ 4 15.12.2011 21:41
Управление положением мыши, WPF Marinne WPF, UWP, WinRT, XAML 1 07.05.2011 00:28
Обработчики событий мыши для компоненты Image Don Karleone Общие вопросы Delphi 12 22.07.2010 09:04
Перехват событий клавиатуры и мыши (X system) damned20 Qt и кроссплатформенное программирование С/С++ 4 26.02.2010 13:18
Перехват событий клавиатуры и мыши (X system) damned20 Общие вопросы C/C++ 0 25.02.2010 10:40