Silverlight: MouseLeftButtonUp не срабатывает - PullRequest
0 голосов
/ 07 марта 2012

Я новичок в 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;
        }

, и этот обработчик добавляется с помощью событий смешивания (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 MainPage

<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 ]

0 голосов
/ 08 марта 2012

Сейчас работает, хотя я не уверен в ответе, но я изменил функцию OnMouseUp, дважды щелкнув по месту событий Blend для MouseUp, и он стал

private void drawingArea_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            _isDrawing = false;
            drawingArea.Children.Remove(_selectionBox);
        }

У кого-нибудь есть объяснение, что вызвало проблему? имя обработчика имеет такой эффект? Мне интересно ..

0 голосов
/ 07 марта 2012

Я думаю, причина в том, что ваш прямоугольник получает событие 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;
        }

`

...