Доброго времени суток!
Проблема в следующем: пытаюсь сделать рисование отрезков мышью на 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>