1

我有一个画布,上面有许多动态显示的图像,我使用了项目控件。我必须拖放并旋转(鼠标右键单击)这些图像并将新位置和旋转角度更新回源代码(VM 和模型)。

当我在画布上拖放图像时,我能够在我的屏幕上显示图像,并且我的 canvas.left 和 canvas.right 正在更新源中的新位置。问题是当我旋转图像时,图像被旋转但源中的新角度没有在我的源(VModel)中更新,我的意思是当我旋转图像时这个属性永远不会被调用。

 public double Angle {
            get { return angle; }
            set  //NEVER GETS CALLED ON ROTATION
            {
                angle = value;
                RaisePropertyChanged("Angle");
            }
        }

它是正确绑定的,因为当我在画布上动态显示图像时,它们以我从源提供的相同角度显示。早些时候我怀疑模式没有设置双向绑定。即使我设置为 TwoWay 它也不起作用。我还添加了 UpdateSourceTrigger=PropertyChanged 但仍然不起作用。为什么角度在旋转图像时永远不会更新,而 canvas.left 和 canvas.top 会更新。

这是我的 XAML:

                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <dd:DragCanvas Height="800" Width="1000" Background="Black" x:Name="dragCanvas" 
                         AllowDragging="True" 
                         />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Image Source="{Binding Path=path}" >
                        </Image>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemContainerStyle>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="Canvas.Left" Value="{Binding Path=Canvas_Left , Mode=TwoWay}" />  //It is updated
                        <Setter Property="Canvas.Top" Value="{Binding Path=Canvas_Top , Mode=TwoWay}" /> //It is Updated
                        <Setter Property="RenderTransform">  //It never updated from target to source but source to target is updated
                            <Setter.Value>
                                <RotateTransform Angle="{Binding Path=Angle ,Mode=TwoWay}"/>
                            </Setter.Value>
                        </Setter>                                
                    </Style>
                </ItemsControl.ItemContainerStyle>
            </ItemsControl>

这是我在鼠标右键单击时旋转的地方(在 dd:DragCanvas 内)

   public class DragCanvas : Canvas
    {

       protected override void OnMouseRightButtonUp(MouseButtonEventArgs e)  //HERE IS WHERE I ROTATE by 90 degree
        {
            base.OnMouseRightButtonUp(e);
            ElementBeingDragged = e.Source as UIElement;
            var rotateTransform = ElementBeingDragged.RenderTransform as RotateTransform;
            if (rotateTransform == null)
            {
                rotateTransform = new RotateTransform();
                ElementBeingDragged.RenderTransform = rotateTransform;
                ElementBeingDragged.RenderTransformOrigin = new Point(0.5, 0.5);
            }
            rotateTransform.Angle += 90;
            ElementBeingDragged.UpdateLayout();
        }
    }

如何更新角度属性(目标到源),这样每次我旋转图像时,我都设置了属性角度的一部分,称为

public double Angle {
            get { return angle; }
            set  //It must be called when i rotate the image on right mouse click
            {
                angle = value;
                RaisePropertyChanged("Angle");
            }
        }
4

1 回答 1

1

您正在绑定LayoutTransform但正在更新RenderTransform. LayoutTransform在计算布局时应用,而RenderTransform在渲染时应用。

将您的绑定更改为RenderTransform,它应该可以工作。

编辑:刚刚意识到切换到 using 时RenderTransform,您需要将变换应​​用于图像,而不是ContentPresenter包装图像。

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Image Source="{Binding Path=path}" >
            <Image.ItemContainerStyle>
                <Style TargetType="ContentPresenter">
                    <Setter Property="RenderTransform">
                        <Setter.Value>
                            <RotateTransform Angle="{Binding Path=Angle ,Mode=TwoWay}"/>
                        </Setter.Value>
                    </Setter>                                
            </Style>
            </Image.Style>
        </Image>
    </DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
    <Style TargetType="ContentPresenter">
        <Setter Property="Canvas.Left" Value="{Binding Path=Canvas_Left , Mode=TwoWay}" />
        <Setter Property="Canvas.Top" Value="{Binding Path=Canvas_Top , Mode=TwoWay}" />                       
    </Style>
</ItemsControl.ItemContainerStyle>

如果您在布局过程中应用转换,它将调整布局中的其他项目以适应。因此,对ContentPresenter包装Imageduring Layout 的变换应用也会计算出它需要对 inside 应用相同的变换Image

但如果在渲染期间应用它,则只有ContentPresenter应用了变换,并且子Image元素保持不变,因为初始布局通道决定它不需要任何修改。

于 2017-06-28T15:31:05.253 回答