Я сделал набор цветов с одним изображением (цвет 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
Есть ли причина, по которой вы ловите исключения, но не обрабатываете их? Это может быть трудно устранить, если есть исключения, которые вы не видите. Попробуйте удалить блоки try/catch и посмотреть, не выбрасывают ли они какие-либо исключения. –
Привет, Джон, я просто изменился в соответствии с вашими советами, но не исключены исключения. Я обновил свой пост. – lecloneur
Работа с имуществом IsHitTestVisible. – AnjumSKhan