Я пытаюсь использовать правую кнопку мыши для перемещения изображения, используя MatrixTransform
(я использую MatrixTransform
, поскольку я также масштабирую изображение).
Вот мой Xaml
код:
<Image x:Name="StreamImage" Source="{Binding Image, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Stretch="None"
RenderTransform="{Binding Overlays.RenderTransform, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<ItemsControl x:Name="StreamCanvasItemSource" ItemsSource="{Binding CanvasItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="{Binding ActualWidth, ElementName=StreamImage}" Height="{Binding ActualHeight, ElementName=StreamImage}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas x:Name="StreamCanvas" Background="Transparent" Width="{Binding ActualWidth, ElementName=StreamImage}"
Height="{Binding ActualHeight, ElementName=StreamImage}"
Visibility="{Binding ImageExists, Converter={StaticResource BooleanToVisibilityConverter}}">
<Interactivity:Interaction.Triggers>
<Interactivity:EventTrigger EventName="PreviewMouseWheel">
<Command:EventToCommand Command="{Binding Overlays.OnMouseWheelCommand}" PassEventArgsToCommand="True" />
</Interactivity:EventTrigger>
<Interactivity:EventTrigger EventName="MouseMove">
<Command:EventToCommand Command="{Binding Overlays.OnMouseMoveCommand}" PassEventArgsToCommand="True"
CommandParameter="{Binding ElementName=StreamImage}" />
</Interactivity:EventTrigger>
<Interactivity:EventTrigger EventName="MouseDown">
<Command:EventToCommand Command="{Binding OnMouseDownCommand}" PassEventArgsToCommand="True" />
</Interactivity:EventTrigger>
<Interactivity:EventTrigger EventName="MouseEnter">
<Command:EventToCommand Command="{Binding Overlays.OnEnterExitCommand}" CommandParameter="Enter" />
</Interactivity:EventTrigger>
<Interactivity:EventTrigger EventName="MouseLeave">
<Command:EventToCommand Command="{Binding Overlays.OnEnterExitCommand}" CommandParameter="Leave" />
</Interactivity:EventTrigger>
</Interactivity:Interaction.Triggers>
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
В моем ViewModel
:
private MatrixTransform m_renderTransform = new MatrixTransform();
private Point m_previouseLocation = new Point(-1, -1);
public Point MouseLoaction { get; set; }
public MatrixTransform RenderTransform
{
get => m_renderTransform;
set
{
m_renderTransform = value;
OnPropertyChanged();
}
}
private void OnMouseMove(object parameter)
{
MouseLoaction = Mouse.GetPosition(image);
if ((m_previouseLocation.X == -1) && (m_previouseLocation.Y == -1))
m_previouseLocation = MouseLoaction;
if (Mouse.RightButton == MouseButtonState.Pressed)
{
var matrix = RenderTransform.Matrix;
matrix.TranslatePrepend(MouseLoaction.X - m_previouseLocation.X, MouseLoaction.Y - m_previouseLocation.Y);
RenderTransform.Matrix = matrix;
}
m_previouseLocation = MouseLoaction;
}
}
Когда я делаю следующее, изображение перемещается (переводится), но оноочень размыто, как будто изображение «сжимается» во время движения.
Я также попытался использовать TransformGroup
, указав MatrixTransform
в качестве первого дочернего элемента для масштабирования и TranslateTransform
в качестве второго дочернего элемента длядвигался, но потом, когда я сделал небольшое движение, изображение было за пределами границ.
Чего мне не хватает?