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