Silverlight: MouseLeftButtonUp не срабатывает
Я новичок в Silverlight, и я работаю над рисованием прямоугольника на экране во время выполнения,
У меня есть класс ( SelectionBox), и на главной странице у меня есть холст, при нажатии на этот холст у меня есть следующая функция под названием
private void BeginDrawing(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
_initXPos = e.GetPosition(drawingArea).X;
_initYPos = e.GetPosition(drawingArea).Y;
_selectionBox = new SelectionBox ();
drawingArea.Children.Add(_selectionBox);
_isDrawing = true;
}
и этот обработчик был добавлен через blend Events (MouseLeftButtonDown)
когда мышь движется, вызывается следующий метод, также добавляемый через события Blend,
private void UpdateSelectionBox(object sender, System.Windows.Input.MouseEventArgs e)
{
if(!_isDrawing &&)
return;
double rectWidth, rectHeight, rectXPos, rectYPos;
if (e.GetPosition(drawingArea).X >= _initXPos)
{
rectWidth = e.GetPosition(drawingArea).X - _initXPos;
rectXPos = _initXPos;
}
else
{
rectWidth = _initXPos - e.GetPosition(drawingArea).X;
rectXPos = e.GetPosition(drawingArea).X;
}
if (e.GetPosition(drawingArea).Y >= _initYPos)
{
rectHeight = e.GetPosition(drawingArea).Y - _initYPos;
rectYPos = _initYPos;
}
else
{
rectHeight = _initYPos - e.GetPosition(drawingArea).Y;
rectYPos = e.GetPosition(drawingArea).Y;
}
_selectionBox.Width = Math.Abs(rectWidth - 20);
_selectionBox.Height = Math.Abs(rectHeight - 20);
Canvas.SetLeft(_selectionBox, Math.Abs(rectXPos - 20));
Canvas.SetTop(_selectionBox, Math.Abs(rectYPos - 20));
}
при срабатывании mouseLeftButtonUp должен работать следующий обработчик:
private void StopDrawingAndSelect(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
_isDrawing = false;
drawingArea.Children.Remove(_selectionBox);
}
но, к сожалению, это никогда не срабатывает, я ставлю точку останова и пытаюсь ее отладить, но она никогда не достигает, я не уверен, почему, это XAML для класса SelectionBox
<UserControl
...
<Grid x:Name="LayoutRoot">
<Rectangle Fill="#00F4F4F5" Stroke="Black" StrokeDashArray="1 2"/>
</Grid>
</UserControl>
И это XAML главной страницы
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SelectionBoxTraining"
x:Class="SelectionBoxTraining.MainPage"
Width="640" Height="480">
<Grid x:Name="LayoutRoot" Background="White">
<Canvas Margin="165,0,0,0" x:Name="drawingArea" MouseLeftButtonDown="BeginDrawing" Background="#FF959FD6" MouseMove="UpdateSelectionBox" MouseLeftButtonUp="StopDrawingAndSelect" />
</Grid>
</UserControl>
Пожалуйста, кто-нибудь может мне помочь? Я пытался сделать много вещей, но это не сработало
Я надеюсь, что найду помощь здесь,
ПРИМЕЧАНИЕ. Свойства не включены в код XAML для экономии места,
Благодарю вас.
2 ответа
Теперь он работает, хотя я не уверен в ответе, но я изменил функцию OnMouseUp, дважды щелкнув по месту событий Blend для MouseUp, и он стал
private void drawingArea_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
_isDrawing = false;
drawingArea.Children.Remove(_selectionBox);
}
У кого-нибудь есть объяснение, что вызвало проблему? имя обработчика имеет такой эффект? Я думаю..
Я предполагаю, что причина в том, что ваш прямоугольник получает событие UP и (каким-то образом?) Не выдает его на холст. Поэтому попробуйте установить ishitestvisible в false:
private void BeginDrawing(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
_initXPos = e.GetPosition(drawingArea).X;
_initYPos = e.GetPosition(drawingArea).Y;
_selectionBox = new SelectionBox ();
_selectionBox.IsHitTestVisible = false;
drawingArea.Children.Add(_selectionBox);
_isDrawing = true;
}
`