Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать выполнение событий по щелчку мыши? Микура 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 12:18
Перехват событий клавиатуры и мыши (X system) damned20 Общие вопросы C/C++ 0 25.02.2010 09:40