2016-03-16 3 views
0

Я сделал набор цветов с одним изображением (цвет HUE) и слайдер (уровень яркости).WPF - MouseMove на изображении, содержащемся в Popup

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="0.8*"/> 
     <ColumnDefinition Width="0.2*"/> 
    </Grid.ColumnDefinitions> 
    <Border x:Name="borderColorChart" Grid.Column="0"> 
     <Grid> 
      <Image Stretch="Fill" Source="Assets/colorChart.PNG" MouseDown="Image_MouseDown" MouseMove="Image_MouseMove"/> 
      <Ellipse x:Name="colorMarker" Width="5" Height="5" StrokeThickness="1" Stroke="#FF0B0B0B"/> 
     </Grid> 
    </Border> 
    <Border x:Name="brightnessSliderBorder" Background="{DynamicResource BrightnessGradient}" Grid.Column="1"> 
     <Grid> 
      <Slider x:Name="brightnessSlider" Orientation="Vertical" IsMoveToPointEnabled="True" Focusable="False" Minimum="0.0" Maximum="1.0" Style="{DynamicResource SliderStyle}" /> 
     </Grid> 
    </Border> 
</Grid> 

Этот цвет-подборщика содержится в Popup, которые открываются при нажатии на кнопку переключения:

<ToggleButton x:Name="SelectColorChannel1" Grid.Row="0" Background="{Binding SelectedCurrentColor, ElementName=Channel1Color}"> 
    <Popup IsOpen="{Binding IsChecked, ElementName=SelectColorChannel1}" StaysOpen="True"> 
     <CMiX:ColorPicker x:Name="Channel1Color"/> 
    </Popup> 
</ToggleButton> 

Вот код MouseMove:

 private void Image_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     var cb = new CroppedBitmap((BitmapSource)(((Image)e.Source).Source), new Int32Rect((int)Mouse.GetPosition(e.Source as Image).X, (int)Mouse.GetPosition(e.Source as Image).Y, 1, 1)); 
      _pixels = new byte[4]; 
       cb.CopyPixels(_pixels, 4, 0); 
       UpdateCurrentColor(); 
       UpdateMarkerPosition(); 
      UpdateSlider(); 
    } 

    private void Image_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (Mouse.LeftButton == MouseButtonState.Pressed) 
     { 
      if (e.Source.GetType().Equals(typeof(Image))) 
      { 
       var cb = new CroppedBitmap((BitmapSource)(((Image)e.Source).Source), new Int32Rect((int)Mouse.GetPosition(e.Source as Image).X, (int)Mouse.GetPosition(e.Source as Image).Y, 1, 1)); 
       _pixels = new byte[4]; 
       cb.CopyPixels(_pixels, 4, 0); 
       UpdateMarkerPosition(); 
       UpdateCurrentColor(); 
       Mouse.Synchronize(); 
       UpdateSlider(); 
      } 
     } 
    } 

И здесь является функцией для обновления положения маркера

private void UpdateMarkerPosition() 
    { 
     _markerTransform.X = Mouse.GetPosition(borderColorChart).X - (borderColorChart.ActualWidth/2); 
     _markerTransform.Y = Mouse.GetPosition(borderColorChart).Y - (borderColorChart.ActualHeight/2); 
    } 

Проблема заключается в том, что я не могу сдвинуть маркер на изображении, я могу только «щелкнуть» один раз, чтобы переместить его, эта проблема не возникает, если набор цветов содержится в ContextMenu. Но мне нужно всплывающее окно, поэтому оно остается открытым при поиске нужного цвета на изображении и при использовании слайдера.

Подсказка? Спасибо

EDIT 1 --- Я провел некоторое тестирование, и теперь, насколько я понимаю, функция UpdateMarkerPosition() в MouseMove не работает, когда я использую всплывающее окно, но он работает, если я использую контекстное меню ... Тем не менее, UpdateMarkerPosition() работает на MouseDown

EDIT 2 --- Хорошо, так что теперь я точно знаю, что это условие:

if (Mouse.LeftButton == MouseButtonState.Pressed) 

никогда не верно в случае, если я использую WPF Popup

+0

Есть ли причина, по которой вы ловите исключения, но не обрабатываете их? Это может быть трудно устранить, если есть исключения, которые вы не видите. Попробуйте удалить блоки try/catch и посмотреть, не выбрасывают ли они какие-либо исключения. –

+0

Привет, Джон, я просто изменился в соответствии с вашими советами, но не исключены исключения. Я обновил свой пост. – lecloneur

+0

Работа с имуществом IsHitTestVisible. – AnjumSKhan

ответ

0

Вынуть Popup управление с точностью до ToggleButton. И поместите его отдельно снаружи с его Placement свойство, установленное на Mouse.

+0

Это был трюк, спасибо за ваш ответ. Не могли бы вы объяснить, почему? если это не слишком долго. – lecloneur

+0

сначала научитесь отмечать ответ как правильный ответ. теперь, поскольку Popup устанавливается как Content ToggleButton, поэтому внешний элемент управления должен перехватывать событие мыши. – AnjumSKhan

+0

Прежде всего, вы должны узнать, что если пользователь имеет менее 15 репутаций, он не может отметить ответ как правильный, и теперь это мое дело. Спасибо за информацию в любом случае. – lecloneur

Смежные вопросы