【问题标题】:Change the actual position of a shape更改形状的实际位置
【发布时间】:2011-11-04 10:12:03
【问题描述】:

在 wpf 上,我已经实施了作为问题答案提出的做法:How to drag a UserControl inside a Canvas 以便在画布上拖动和移动项目(形状、子画布)。但是,正如正确指出的相同问题的下一个答案,该方法内部存在缺陷:

private void Control_MouseMove(object sender, MouseEventArgs e)
{
    var draggableControl = sender as UserControl;

    if (isDragging && draggableControl != null)
    {
        Point currentPosition = e.GetPosition(this.Parent as UIElement);

        var transform = draggableControl.RenderTransform as TranslateTransform;
        if (transform == null)
        {
            transform = new TranslateTransform();
            draggableControl.RenderTransform = transform;
        }

        transform.X = currentPosition.X - clickPosition.X;
        transform.Y = currentPosition.Y - clickPosition.Y;
    }
}

它使用 RenderTranform,它不会永久更改项目的位置,而是更改其视觉位置。结果是该项目在下一个鼠标事件时返回到其初始位置,因此拖放无法正常工作(您不能以这种方式实际移动它,而只能在视觉上移动它)。应该对其进行什么样的修改纠正方法的功能?是否有类似的做法可以正确执行任务?我应该使用另一个像布局变换这样的变换吗?

【问题讨论】:

  • 控件位置被重置的事实与 RenderTransform 的使用无关,如果有的话,这只是糟糕的编码。
  • 看msdn.microsoft.com/en-us/library/…的备注。它谈到了“暂时的影响”。
  • 这并没有改变一个事实,即一个人可以使用它编写持久的拖动功能。

标签: c# wpf drag-and-drop


【解决方案1】:

您所做的是一种可能的实现,但在 WPF 中已经存在一个用于拖动的控件:Thumb。

示例:

      <Canvas Width="200" Height="200" Background="Yellow">
            <Thumb x:Name="DragThumb"  DragDelta="Mover_DragDelta" Canvas.Top="20" Canvas.Left="10" Background="Gray" Width="50" Height="50" >
                <Thumb.Template>
                    <ControlTemplate>
                        <Rectangle Fill="Black" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" />
                    </ControlTemplate>
                </Thumb.Template>
            </Thumb>
        </Canvas>

后面有一个非常简单的代码:

private void Mover_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
    Canvas.SetLeft(DragThumb, Canvas.GetLeft(DragThumb) + e.HorizontalChange);
    Canvas.SetTop(DragThumb, Canvas.GetTop(DragThumb) + e.VerticalChange);
}

已经移动了你的画布。 (并且它保持为 Canvas.Top / Canvas.Left Positions 设置)。

【讨论】:

  • 好的,是否可以在拇指上添加更多形状以构建复合形状?或者我应该在其中包裹一个子画布并将形状放在子画布上?
  • 当然,您可以根据需要在 Thumb 中添加任何内容。您只需更新 ControlTemplate 并添加您想要的任何内容。
【解决方案2】:

您可以使用 Canvas.Left 和 Canvas.Top 属性,而不是使用 RenderTransform 进行模拟。

Canvas.SetLeft(this, Canvas.GetLeft(this) + delta.X);
Canvas.SetTop(this, Canvas.GetTop(this) + delta.Y);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多