UWP无论如何都要实现控件来调整大小,并在Canvas中移动文本框?

luv*_*nie 1 c# controls canvas uwp uwp-xaml

我是UWP canvas元素的新手.从我找到实现它的方式的那一刻起.我找到了这个链接,这个链接实现了我想要的控件.但是我遵循在其中定义的类.我无法继承显示它是密封类型的Thumb控件.有没有人知道如何找到实现这个的方法?

public class MoveThumb : Thumb
{

    public MoveThumb(Control dataContext, DragDeltaEventHandler dragDelta)
    {
        DataContext = dataContext;
        DragDelta = dragDelta;
    }

    public Control DataContext { get; private set; }
    public DragDeltaEventHandler DragDelta { get; }

    private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        Control designerItem = this.DataContext as Control;

        if (designerItem != null)
        {
            double left = Canvas.GetLeft(designerItem);
            double top = Canvas.GetTop(designerItem);

            Canvas.SetLeft(designerItem, left + e.HorizontalChange);
            Canvas.SetTop(designerItem, top + e.VerticalChange);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jet*_*per 6

我有一些样品.认为你会明白这个想法.这是UserControlXAML:

Width="256"
Height="128">

<Grid x:Name="ContainerGrid" Background="Transparent"
      ManipulationMode="TranslateX,TranslateY"
      ManipulationStarted="Manipulator_OnManipulationStarted"
      ManipulationDelta="Manipulator_OnManipulationDelta">

    <Viewbox IsHitTestVisible="False">
        <TextBlock Text="Text" Foreground="Lime"/>
    </Viewbox>

    <Rectangle x:Name="ResizeRectangle" IsHitTestVisible="False"
               Width="16" Height="16" Fill="Orange" 
               VerticalAlignment="Bottom" HorizontalAlignment="Right"/>

    <Rectangle Stretch="Fill" Stroke="DeepPink" StrokeThickness="2"
               IsHitTestVisible="False"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

还有一个代码:

    private bool _isResizing;

    public Manipulator()
    {
        InitializeComponent();
    }

    private void Manipulator_OnManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
    {
        if (e.Position.X > Width - ResizeRectangle.Width && e.Position.Y > Height - ResizeRectangle.Height) _isResizing = true;
        else _isResizing = false;
    }

    private void Manipulator_OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        if (_isResizing)
        {
            Width += e.Delta.Translation.X;
            Height += e.Delta.Translation.Y;
        }
        else
        {
            Canvas.SetLeft(this, Canvas.GetLeft(this) + e.Delta.Translation.X);
            Canvas.SetTop(this, Canvas.GetTop(this) + e.Delta.Translation.Y);
        }
    }
Run Code Online (Sandbox Code Playgroud)

创建完成后,UserControl只需将其放入Canvas:

<Canvas>
    <local:Manipulator/>
</Canvas>
Run Code Online (Sandbox Code Playgroud)

我称之为Manipuilator.

这是它的样子:

在此输入图像描述