在Xamarin中可以拖动编辑器吗?

uttx8gqw  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(222)

我想做一个功能,就像其他社交媒体应用程序一样,用户可以在帖子中添加文本,并将文本拖动到他们想要的任何地方。我有一个编辑器的代码,它允许用户输入任何他们想要的,它显示在屏幕上,当用户单击一个按钮。键入明智的,它的工作非常好,但现在我想实现一个功能,用户可以拖动文本到任何他们想要的地方,因为作为默认,我设置为显示在屏幕中间的文本。我尝试使用PanGestureRecognizer,但不确定这是否是正确的方法,或者是否有更好的方法。有没有一种方法,一旦用户完成使用Editor的输入,他们就可以把它拖到任何他们想要的地方?这是编辑器的代码。

<Editor IsVisible="{Binding HasTextBox}" Text="{Binding EntryText}" HorizontalOptions="Center" VerticalOptions="Center">
   <Editor.GestureRecognizers>
      <PanGestureRecognizer PanUpdated="OnPanUpdated" />
   </Editor.GestureRecognizers>
</Editor>

这是我的PanUpdated方法的代码,它不起作用。

double x, y;

        private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
        {
            var editor = sender as Editor;

            switch (e.StatusType)
            {
                case GestureStatus.Started:
                    // Store the current position
                    x = editor.TranslationX;
                    y = editor.TranslationY;
                    break;
                case GestureStatus.Running:
                    // Adjust the position based on the user's movement
                    editor.TranslationX = x + e.TotalX;
                    editor.TranslationY = y + e.TotalY;
                    break;
                case GestureStatus.Completed:
                    // Optionally store the final position
                    x = editor.TranslationX;
                    y = editor.TranslationY;
                    break;
            }
        }
w8f9ii69

w8f9ii691#

是的,您可以将PanGestureRecognizer用于此用例。要实现可拖动的编辑器/按钮/任何控件,您可以使用PanGestureRecognizer和操纵该控件的位置的组合。
您需要从ContentView类创建自定义控件,如:

public class DraggableView : ContentView
{
    private double _startX, _startY;

    public DraggableView()
    {
        var panGesture = new PanGestureRecognizer();
        panGesture.PanUpdated += OnPanUpdated;
        GestureRecognizers.Add(panGesture);
    }

    private void OnPanUpdated(object sender, PanUpdatedEventArgs e)
    {
        switch (e.StatusType)
        {
            case GestureStatus.Started:
                _startX = TranslationX;
                _startY = TranslationY;
                break;

            case GestureStatus.Running:
                TranslationX = _startX + e.TotalX;
                TranslationY = _startY + e.TotalY;
                break;

            case GestureStatus.Completed:
                // you can handle any additional actions over here when the dragging is been completed
                break;
        }
    }
}

你可以在xaml中使用它,比如:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:YOURNAMESPACE"     // Add the reference of draggable view
             x:Class="YOURNAMESPACE.YOURPAGE">
    <Grid>
        <local:DraggableView>
            <Editor Text="This is a draggable editor" />
            // You can add any control here which you want to make draggable
        </local:DraggableView>
    </Grid>
</ContentPage>

您可以根据您的要求设置UI组件,如设置背景颜色等。

相关问题