2012-05-24 67 views
10

Được rồi, tôi đã gãi đầu như điên về vấn đề này và đã dành một vài giờ tốt để nghiên cứu cách hoạt động nhưng tôi vẫn chưa tìm thấy câu trả lời, nếu bạn muốn để xem bất kỳ SRC nào của tôi cảm thấy tự do để hỏi về nó và tôi sẽ xem tôi có thể giúp gì không.Cuộn trong khi kéo và thả (WPF)

Về cơ bản các vấn đề tôi đang gặp là tôi có một TreeView các thư mục trong ví dụ ứng dụng của tôi:

Catalog 

    Brands 
    Nike 
    Adidas 
    Lactose 

    Styles 
    Sandles 
    Trainers 
    Boots 

Vấn đề mà tôi đang cố gắng để sửa chữa là khi tôi kéo một thư mục trên (Điều này được xử lý trong lớp DragDropManager), tôi không thể di chuyển lên hoặc xuống (chỉ cần hiển thị một dấu hiệu dừng đáng yêu). Tôi cũng không thể tìm thấy một cuộn giấy trong treeview, vì vậy tôi không chắc chắn nó được tạo ra như thế nào (Đây không phải là phần mềm của riêng tôi, gần đây tôi đã bắt đầu làm việc cho một công ty nên tôi không quen với mã này và không ai khác dường như biết.)

Đây là vấn đề nếu tôi muốn di chuyển thứ gì đó từ trên xuống dưới cùng.

Tính năng cuộn hoạt động bình thường mà không cần kéo xong.

Nếu có ai muốn xem bất kỳ phần nào của mã của tôi, vui lòng hỏi vì tôi không chắc chắn những gì thực sự hiển thị cho các bạn.

Tôi đã đọc qua một số bài viết hay và chỉ còn lại gãi đầu.

Trả lời

17

Tôi đã tạo ra một tài sản gắn liền để đạt được hành vi này, có một cái nhìn tại bài viết của tôi ở đây -

Attached Behavior for auto scrolling containers while doing Drag & Drop

luận chính là một cái gì đó như thế này -

private static void OnContainerPreviewDragOver(object sender, DragEventArgs e) 
{ 
    FrameworkElement container = sender as FrameworkElement; 

    if (container == null) { return; } 

    ScrollViewer scrollViewer = GetFirstVisualChild<ScrollViewer>(container); 

    if (scrollViewer == null) { return; } 

    double tolerance = 60; 
    double verticalPos = e.GetPosition(container).Y; 
    double offset = 20; 

    if (verticalPos < tolerance) // Top of visible list? 
    { 
     //Scroll up 
     scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - offset); 
    } 
    else if (verticalPos > container.ActualHeight - tolerance) //Bottom of visible list? 
    { 
     //Scroll down 
     scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + offset);  
    } 
} 

câu hỏi tương tự trên SO (mặc dù chúng chủ yếu là cho ListBox/ListView nhưng cũng hoạt động cho TreeView quá) -

WPF Listbox auto scroll while dragging

WPF ListView Databound Drag/Drop Auto Scroll

WPF Drag-to-scroll doesn't work correctly

+0

Tôi đã cố gắng sử dụng này trên listbox của tôi, nhưng nó không hoạt động nếu các mục trong hộp danh sách không thể bỏ về. Tôi có các mục hỗn hợp trong hộp danh sách, một số có thể được bỏ đi, một số không thể. Nếu những người gần đầu (hoặc phía dưới) không thể nhận được các giọt thì cuộn không kích hoạt. Bất kỳ ý tưởng về một cách xung quanh đó? –

+0

@Lutz đó là rất thú vị, không bao giờ đi qua kịch bản như vậy vì vậy không thể nói nhiều. Tôi có thể nghĩ về 1. Thêm một số mặt hàng giả giữa các mục hiện tại (với chiều cao nhỏ vv để chúng trông không có vẻ hơi lạ hoặc lãng phí), khiến chúng có thể bị phân hủy sao cho PreviewDragOver luôn được gọi cho chúng. Nhưng bạn sẽ phải xử lý thả vv 2. Làm cho tất cả các mục có thể phân hủy và xử lý xác nhận sau khi thả. 3. Hãy thử tìm xem một số sự kiện khác có được kích hoạt cho những vật phẩm không thể phân hủy này hay không. – akjoshi