拖放在ScrollViewer中不起作用

加奶咖啡

我的问题是,当我将画布包裹在scrollviewer中时,边框的拖放变得不起作用。

将1200x1200画布放入500x500滚动查看器中。我希望画布在scrollviewer中可滚动(触摸幻灯片)。在画布上进行拖放操作之前,我可以将其完美地插入到滚动查看器中。

MainWindow.xaml

<Grid ClipToBounds="True">
        <ScrollViewer Name="scbb" Width="500" Height="500" HorizontalScrollBarVisibility="Hidden" 
            VerticalScrollBarVisibility="Hidden" HorizontalAlignment="Left"  
            VerticalAlignment="Top" Background="LightBlue" ScrollViewer.CanContentScroll="True">
        <Canvas x:Name="canvas" Width="1200" Height="1200"
            MouseLeftButtonDown="CanvasMouseLeftButtonDown"
            MouseLeftButtonUp="CanvasMouseLeftButtonUp"
            MouseMove="CanvasMouseMove">
        </Canvas>
        </ScrollViewer>
        <Button x:Name="btnEnable" Content="Enable" Height="50" Width="50" Margin="0,0,115,10" VerticalAlignment="Bottom" 
            HorizontalAlignment="Right" Click="btnEnable_Click"/>
        <Button Content="Add Image" Width="100" Height="100" VerticalAlignment="Bottom" 
            HorizontalAlignment="Right" Click="AddButtonClick" Margin="0,0,10,10"/>
    </Grid>

MainWindow.xaml.cs

private void AddButtonClick(object sender, RoutedEventArgs e)
        {
            int iNum = SETTING.GetTableRunningNumber();

            var borderWrap = new Border();
            borderWrap.Width = 100;
            borderWrap.Height = 100;
            borderWrap.Background = Brushes.Green;

            var label1 = new Label();
            label1.VerticalAlignment = VerticalAlignment.Center;
            label1.HorizontalAlignment = HorizontalAlignment.Center;
            label1.Content = "Table " + iNum.ToString();
            label1.Name = "Table" + iNum.ToString();
            label1.Foreground = Brushes.White;
            label1.FontWeight = FontWeights.Bold;

            borderWrap.Child = label1;
            borderWrap.MouseDown += TableMouseDown;

            Canvas.SetLeft(borderWrap, 10);
            Canvas.SetTop(borderWrap, 10);
            canvas.Children.Add(borderWrap);

            iNum += 1;
            SETTING.SetTableRunningNumber(iNum);
        }

        private Point mousePosition;
        private Border draggedBorder;

        private void TableMouseDown(object sender, MouseButtonEventArgs e)
        {
            if (!SETTING.GetEnableDrag())
            {
                var cLabel = e.Source as Label;
                var bBorder = e.Source as Border;

                if (cLabel != null)
                {
                    MessageBox.Show(cLabel.Name.ToString());
                }
            }
        }

        private void CanvasMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (SETTING.GetEnableDrag())
            {
                var dBorder = e.Source as Border;
                var cLabel = e.Source as Label;

                if (dBorder == null)
                {
                    dBorder = (Border)cLabel.Parent;
                }

                if (dBorder != null && canvas.CaptureMouse())
                {
                    mousePosition = e.GetPosition(canvas);
                    draggedBorder = dBorder;
                    Panel.SetZIndex(draggedBorder, 1);
                }
            }           
        }

        async Task PutTaskDelay100()
        {
            await Task.Delay(100);
        }

        private async void CanvasMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (SETTING.GetEnableDrag())
            {
                await PutTaskDelay100();
                if (draggedBorder != null)
                {
                    canvas.ReleaseMouseCapture();
                    Panel.SetZIndex(draggedBorder, 0);
                    draggedBorder = null;
                }

            }
        }

        private void CanvasMouseMove(object sender, MouseEventArgs e)
        {
            if (SETTING.GetEnableDrag())
            {
                double canvasSize = 1200;
                if (draggedBorder != null)
                {
                    var position = e.GetPosition(canvas);
                    var offset = position - mousePosition;
                    mousePosition = position;

                    double newTop = Canvas.GetTop(draggedBorder) + offset.Y;
                    double newLeft = Canvas.GetLeft(draggedBorder) + offset.X;

                    if (newTop < 0)
                    {
                        newTop = 0;
                    }
                    else if (newTop + draggedBorder.ActualWidth > canvasSize)
                        newTop = canvasSize - draggedBorder.ActualWidth;

                    if (newLeft < 0)
                    {
                        newLeft = 0;
                    }
                    else if (newLeft + draggedBorder.ActualWidth > canvasSize)
                        newLeft = canvasSize - draggedBorder.ActualWidth;

                    Canvas.SetLeft(draggedBorder, newLeft);
                    Canvas.SetTop(draggedBorder, newTop);
                }
            }       
        }
韦恩

几个月前我遇到了问题,并通过这些附加功能在后面的代码中解决了该问题。

在WindowMain.xaml.cs中的InitializeComponent之后添加:

    public WindowMain()
{
    InitializeComponent();

    // your code, etc.

    scrollViewer.AllowDrop = true;
    scrollViewer.PreviewDragEnter += scrollViewer_PreviewDragEnter;
    scrollViewer.PreviewDragOver += scrollViewer_PreviewDragOver;
    scrollViewer.Drop += scrollViewer_Drop;
}


void scrollViewer_PreviewDragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        e.Effects = DragDropEffects.Copy;
    }
    else
    {
        e.Effects = DragDropEffects.None;
    }
}

void scrollViewer_PreviewDragOver(object sender, DragEventArgs e)
{
    e.Handled = true;
}

bool IsDataAvailable = false;
void scrollViewer_Drop(object sender, DragEventArgs e)
{
    // Get data object
    var dataObject = e.Data as DataObject;

    // Check for file list
    if (dataObject.ContainsFileDropList())
    {
        // Process file names
        StringCollection fileNames = dataObject.GetFileDropList();
        bool isIsDataAvailable = false;
        try
        {
            var uri = new Uri(fileNames[0]);
            BitmapSource imageSource = new BitmapImage(uri);
            isIsDataAvailable = true;
        }
        catch (Exception error)
        {
            string errorMessage = error.ToString();
        }
        finally
        {
            IsDataAvailable = isIsDataAvailable;
        }
    }
}

我的程序只是从放置在ScrollViewer上的资源管理器文件列表中加载放置的文件。必须scbb.AllowDrop=true在ScrollViewer中设置。以及处理基本拖放的例程。一旦ScrollViewer允许删除,您的代码就应该可以工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

拖放在IE中不起作用

来自分类Dev

拖放在Xcode中不起作用

来自分类Dev

拖放在Chrome中不起作用

来自分类Dev

Selenium拖放在Chrome或Firefox中不起作用

来自分类Dev

拖放在C#中不起作用

来自分类Dev

为什么HTML5拖放在Firefox中不起作用?

来自分类Dev

拖放在C#Winforms应用程序中不起作用

来自分类Dev

Dropzone.js拖放在IE10中不起作用

来自分类Dev

拖放在Android Studio设计选项卡中不起作用

来自分类Dev

Dropzone.js拖放在IE10中不起作用

来自分类Dev

拖放在Android Studio设计选项卡中不起作用

来自分类Dev

Swift拖放在Xcode之外不起作用

来自分类Dev

jQuery UI拖放在移动设备上不起作用

来自分类Dev

角度拖放在移动设备上不起作用

来自分类Dev

Jqgrid拖放在平板电脑中不起作用

来自分类Dev

html 5拖放在移动屏幕上不起作用

来自分类Dev

ScrollViewer在groupbox中不起作用?

来自分类Dev

ScrollViewer在Canvas中不起作用

来自分类Dev

ScrollViewer在Canvas中不起作用

来自分类Dev

在Aurelia中拖放不起作用

来自分类Dev

在景观中拖放图像不起作用

来自分类Dev

在景观中拖放图像不起作用

来自分类Dev

拖放在Gnome3文件管理器中不起作用,而是选择多个文件

来自分类Dev

13.10拖放不起作用

来自分类Dev

Gridster拖放不起作用

来自分类Dev

13.10拖放不起作用

来自分类Dev

多次拖放不起作用

来自分类Dev

Scrollviewer中的WPF组合框不起作用

来自分类Dev

DataGrid.ColumnWidth =“ *”在ScrollViewer中不起作用