2017-01-13 3 views
0

Моя проблема заключается в том, что перетаскивание границы не работает, когда я обматываю холст внутри scrollviewer.Drag And Drop не работает в ScrollViewer

1200x1200 холст, помещенный в прокрутку 500x500. Я хочу, чтобы холст прокручивался (сенсорный слайд) в 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); 
       } 
      }  
     } 

ответ

0

меня была проблема месяцев назад и решить ее в коде позади с этими дополнениями.

После InitializeComponent в WindowMain.xaml.cs добавить:

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 позволяет отказаться.

+0

Спасибо, что в настоящее время мой код перетаскивания сделан на холсте. Пока холст 1200x1200 помещается в scrollviewer размером 500x500. Я хочу, чтобы холст прокручивался (сенсорный слайд) в scrollviewer. –

+1

Итак, как только вы добавили Canvas в ScrollViewer, это не сработало. ScrollViewer не включен для drop, добавляет scbb.AllowDrop = true в: Wayne