2010-10-10 21 views
7

Tôi đang ràng buộc một ItemsControl bằng Canvas dưới dạng ItemsPanelTemplate vào ObservableCollection.Kết hợp các mụcControl với các mục có thể kéo - Element.parent luôn rỗng

Tôi muốn thực hiện các mục có thể kéo bằng cách sử dụng DraggableExtender như được đăng trong Dragging an image in WPF (Tôi không muốn sử dụng biến đổi - tôi cần phải sử dụng Canvas Left và tài sản trên)

Nó định nghĩa là:

<ItemsControl ItemsSource="{Binding Path=Nodes}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas IsItemsHost="True" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Views:NodeView DataContext="{Binding}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemContainerStyle> 
      <Style TargetType="ContentPresenter"> 
       <Setter Property="Utilities:DraggableExtender.CanDrag" Value="True" /> 
       <Setter Property="Canvas.Left" Value="{Binding Path=X}" /> 
       <Setter Property="Canvas.Top" Value="{Binding Path=Y}" /> 
      </Style> 
     </ItemsControl.ItemContainerStyle> 
    </ItemsControl> 

DraggableExtender cần cha mẹ của phần tử là Canvas, nhưng phần tử cha của phần tử của tôi (contentpresenter) là rỗng, vì vậy thao tác kéo không hoạt động.

Vì vậy, câu hỏi hiển nhiên là - tôi đang làm gì sai?

Trả lời

7

Vì các mục không nằm ngay bên trong canvas, bạn cần phải đi lên cây hình ảnh cho đến khi bạn tìm thấy canvas. Tôi thường sử dụng phương pháp mở rộng sau để làm điều đó:

public static T FindAncestor<T>(this DependencyObject obj) 
    where T : DependencyObject 
{ 
    DependencyObject tmp = VisualTreeHelper.GetParent(obj); 
    while(tmp != null && !(tmp is T)) 
    { 
     tmp = VisualTreeHelper.GetParent(tmp); 
    } 
    return tmp as T; 
} 

Đặt phương thức ở trên trong lớp tĩnh và nhập không gian tên nơi nó được khai báo. Trong đoạn mã DraggableExtender, chỉ cần thay thế dòng này:

Canvas canvas = element.Parent as Canvas; 

Với một cú này:

Canvas canvas = element.FindAncestor<Canvas>(); 
+0

Chúc mừng, nó hoạt động như một nét duyên dáng. – Pygmy

Các vấn đề liên quan