C# 拖放在ScrollViewer中不起作用

C# 拖放在ScrollViewer中不起作用,c#,wpf,C#,Wpf,我的问题是,当我将画布包装到scrollviewer中时,边框的拖放无法工作 1200x1200画布放入500x500 scrollviewer。我希望画布在scrollviewer中可滚动(触摸幻灯片)。在我插入scrollviewer之前,画布中的拖放操作非常有效 MainWindow.xaml <Grid ClipToBounds="True"> <ScrollViewer Name="scbb" Width="500" Height="500" Hori

我的问题是,当我将画布包装到scrollviewer中时,边框的拖放无法工作

1200x1200画布放入500x500 scrollviewer。我希望画布在scrollviewer中可滚动(触摸幻灯片)。在我插入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);
                }
            }       
        }
private void addbutton单击(对象发送方,路由目标)
{
int iNum=SETTING.GetTableRunningNumber();
var borderWrap=新边框();
包边宽度=100;
包边高度=100;
borderWrap.Background=画笔.Green;
var label1=新标签();
label1.VerticalAlignment=垂直对中;
label1.HorizontalAlignment=HorizontalAlignment.Center;
label1.Content=“Table”+iNum.ToString();
label1.Name=“Table”+iNum.ToString();
标签1.前景=画笔。白色;
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(英制单位);
}
专用点鼠标定位;
私人边界禁令;
私有void table mousedown(对象发送器,MouseButtonEventArgs e)
{
如果(!SETTING.GetEnableDrag())
{
var cLabel=e.源作为标签;
var bBorder=e.源作为边界;
if(cLabel!=null)
{
Show(cLabel.Name.ToString());
}
}
}
私有void canvas mouseleftbuttondown(对象发送器,MouseButtonEventArgs e)
{
if(设置.GetEnableDrag())
{
var dBorder=e.源作为边界;
var cLabel=e.源作为标签;
if(dBorder==null)
{
dBorder=(Border)cLabel.Parent;
}
if(dBorder!=null&&canvas.CaptureMouse())
{
mousePosition=e.GetPosition(画布);
draggedBorder=dBorder;
面板设置索引(draggedBorder,1);
}
}           
}
异步任务PutTaskDelay100()
{
等待任务。延迟(100);
}
私有异步void CanvasMouseLeftButtonUp(对象发送器,MouseButtonEventArgs e)
{
if(设置.GetEnableDrag())
{
等待PutTaskDelay100();
if(draggedBorder!=null)
{
canvas.ReleaseMouseCapture();
Panel.SetZIndex(draggedBorder,0);
draggedBorder=null;
}
}
}
私有void CanvasMouseMove(对象发送方,MouseEventArgs e)
{
if(设置.GetEnableDrag())
{
双画布尺寸=1200;
if(draggedBorder!=null)
{
var位置=e.GetPosition(画布);
var偏移=位置-鼠标位置;
鼠标位置=位置;
double newTop=Canvas.GetTop(draggedBorder)+offset.Y;
double newLeft=Canvas.GetLeft(draggedBorder)+offset.X;
if(newTop<0)
{
newTop=0;
}
否则如果(newTop+draggedBorder.ActualWidth>canvasSize)
newTop=画布大小-draggedBorder.ActualWidth;
if(newLeft<0)
{
newLeft=0;
}
else if(newLeft+draggedBorder.ActualWidth>canvasSize)
newLeft=画布大小-draggedBorder.ActualWidth;
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上的资源管理器文件列表中加载一个删除的文件。必须设置ScrollViewer中的
scbb.AllowDrop=true
。以及处理基本拖放操作的例程。一旦ScrollViewer允许拖放,您的代码应该可以工作。

谢谢兄弟,目前我的代码拖放是在画布上完成的。当1200x1200画布放入500x500 scrollviewer时。我希望画布在scrollviewer中是可滚动的(触摸幻灯片)。好的,一旦你将画布添加到scrollviewer,它就不起作用了。ScrollViewer未启用拖放,请在以下位置添加scbb.AllowDrop=true: