Применение преобразования преобразования к изображению C # - PullRequest
0 голосов
/ 27 декабря 2018

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

Чего мне не хватает?

...