Событие с помощью CaptureMouse () в Silverlight - PullRequest
0 голосов
/ 24 июня 2011

Я пишу оконную программу в Silverlight, что означает, что верхняя панель всплывающего окна имеет перетаскиваемую область, а внутри этой перетаскиваемой области - X, закрывающий окно. Моя функция перетаскивания имеет событие capturemouse (), которое в сочетании с возникающим всплывающим событием предотвращает вызов функции close. Вот код:

private void close_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e){
            pop.IsOpen = false;
            hasFocus = true;
        }

        private void topBar_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            Border item = sender as Border;
            mouseY = e.GetPosition(null).Y;
            mouseX = e.GetPosition(null).X;
            draggable = true;
            item.CaptureMouse();

        }

        private void topBar_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            if(draggable){
                double changeY = e.GetPosition(null).Y - mouseY;
                double changeX = e.GetPosition(null).X - mouseX;
                double top = changeY + (double)pop.GetValue(Canvas.TopProperty);
                double left = changeX + (double)pop.GetValue(Canvas.LeftProperty);
                if(top<0){
                    top = 0;
                }
                if(left<0){
                    left = 0;
                }
                if(left>670){
                    left = 670;
                }
                if(top>450){
                    top = 450;
                }
                pop.SetValue(Canvas.TopProperty, top);
                pop.SetValue(Canvas.LeftProperty, left);
                mouseY = e.GetPosition(null).Y;
                mouseX = e.GetPosition(null).X;
            }
        }

        private void topBar_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            Border item = sender as Border;
            draggable = false;
            mouseY = -1;
            mouseX = -1;
            item.ReleaseMouseCapture();
        }

РЕДАКТИРОВАТЬ: вот XAML для всего всплывающего окна:

<Popup x:Name="pop" Height="200" Width="200" VerticalAlignment="Center" HorizontalAlignment="Center">
                    <Border CornerRadius="5" Width="200" Height="200" Background="#FFFAFCFF" BorderThickness="1">
                        <Border.BorderBrush>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="#99666666" Offset="0" />
                                <GradientStop Color="#99F5F5F5" Offset="0.5"/>
                                <GradientStop Color="#99666666" Offset="1"/>
                            </LinearGradientBrush>
                        </Border.BorderBrush>
                        <StackPanel>
                            <Border x:Name="topBar" CornerRadius="4,4,0,0" BorderBrush="Silver" BorderThickness="0,0,0,1" Background="Crimson" Width="198" Height="20" MouseLeftButtonDown="topBar_MouseLeftButtonDown" MouseMove="topBar_MouseMove" MouseLeftButtonUp="topBar_MouseLeftButtonUp">
                                <Image x:Name="close" Source="X.png" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,7,0" Height="11" Width="11" MouseLeftButtonUp="close_MouseLeftButtonUp" />
                            </Border>
                            <StackPanel Margin="10">
                                <TextBlock Text="Printer info goes here..." />
                            </StackPanel>
                        </StackPanel>
                    </Border>
                </Popup>

1 Ответ

1 голос
/ 24 июня 2011

Проблема возникает из-за ваших вызовов MouseCapture. Когда вы устанавливаете мышиный захват, граница является единственным элементом управления, которому разрешено инициировать события мыши. Это означает, что изображение, когда кнопка мыши нажата, больше не вызывает событий мыши. Без мышиного захвата все должно работать нормально. Просто для моего любопытства, почему вы устанавливаете и отпускаете его?

Надеюсь, это поможет.

Edit:

Вы можете получить положение mouseEvent и посмотреть, падает ли оно на изображении:

        var x = e.GetPosition(close).X;
        var y = e.GetPosition(close).Y;
        if (0 <= x && x <= 11 && 0 <= y && y <= 11)
        {
            //do the close call
        }

Я не тестировал этот код, но он должен быть близок к тому, что вы хотите сделать.

...