2013-01-11 3 views
0

ScatterViewMainWindow.xaml에 태그가있을 때 표시되는 TagVisualization.xaml이 표시됩니다. 그 안에서 TagVisualization, 내가 라고 부르는 외부 클래스에 의해 채워지는 LibraryBar을 가지고있는 PhotoGallery.xaml을 가지고있다. DragDropScatterView 클래스를 구현하여 LibraryBar에서 항목을 드래그하여 에 놓을 수 있습니다. 새로운 ScatterViewItem이 생성되면 닫기 버튼이 있습니다. 클릭하면 해당 항목이 ScatterView에서 삭제되고 LibraryBar에서 다시 사용하도록 설정됩니다. 내가 문제가되는 것은 PhotoGallery.xaml에 도착할 수 없기 때문에 항목을 다시 사용하는 것입니다. 동일한 LibraryBar에서 파생 된 ScatterViewItem을 터치 한 후 LibraryBar 항목을 다시 사용 가능하게 설정합니다.

는 얼마 전 비슷한 일을했고, 누군가가 나에게 다음과 같은 솔루션 준 다음 _host.Tag 항상 null 때문에

private void SurfaceButton_TouchDown(object sender, TouchEventArgs e) { 
    ScatterViewItem _host = MyApplication.Helpers.VisualTree.FindVisualParent<ScatterViewItem>(this); 

    if (_host != null) { 
     DependencyObject parent = VisualTreeHelper.GetParent(this); 
     ScatterViewItem svi = null; 
     while (parent as DragDropScatterView == null) 
     { 
      if (parent is ScatterViewItem) 
       svi = parent as ScatterViewItem; 
      parent = VisualTreeHelper.GetParent(parent); 
     } 

     // Access directly to the LibraryBar 
     LibraryBar lb = _host.Tag as LibraryBar; 
     lb.SetIsItemDataEnabled(_host.Content, true); 

     ((DragDropScatterView)parent).Items.Remove(this.DataContext); 
    } 

하지만, 내 현재의 프로젝트에,이 작동하지 않습니다. I 즉

private void scatterCloseButton(object sender, TouchEventArgs e) { 
    ScatterViewItem _host = MyApplication.Model.VisualTree.FindVisualParent<ScatterViewItem>(this); 

    if (_host != null) { 

     DependencyObject parent = VisualTreeHelper.GetParent(this); 
     ScatterViewItem svi = null; 
     while (parent as DragDropScatterView == null) { 
      if (parent is ScatterViewItem) 
       svi = parent as ScatterViewItem; 
      parent = VisualTreeHelper.GetParent(parent); 
     } 

     // The data of the item 
     PhotoGalleryViewModel lb = _host.DataContext as PhotoGalleryViewModel; 

     if (lb != null) { 
      // The Tag Visualizer relative to that tag 
      TagVisualizer tagVisualizer = SurfaceFiturApp.Model.VisualTree.FindVisualParent<TagVisualizer>(this); 
      if (tagVisualizer != null) { 
       // The PhotoGallery object where the gallery is in 
       PhotoGallery photoGallery = SurfaceFiturApp.Model.VisualTree.FindVisualChild<PhotoGallery>(tagVisualizer); 
       if (photoGallery != null) { 
        // Enable the item in the library 
        photoGallery.setLibraryItemEnabled(lb); 
       } 
      } 
     } 

     // Remove the object from the ScatterView 
     ((DragDropScatterView)parent).Items.Remove(this.DataContext); 

    } 

} 

하지만 (나는 TagVisualization까지 모든 방법을 와서 LibraryBar를 얻기 위해 모든 방법을 가고 있기 때문에 inneficiency이의 간격에서)이의 문제 : 나는이 함께 와서 관리 다른 LibraryBar's을 구별 할 수 없습니다. 즉 표면에 두 개의 태그가있는 경우 그 중 하나만 항목을 다시 사용할 수있게되고 다른 태그는 아무 것도 안됩니다.

내 질문은 : 코드의 첫 번째 chunck 감안할 때, 내가 어떻게 작동합니까? 거기에서 어떻게하면 LibraryBar에 도달 할 수 있습니까? 즉, ScatterViewItem (PhotoGalleryViewModel)에서 TagVisualization 안에있는 LibraryBar으로 이동하십시오. 즉, 차례대로 의 MainWindow 안에 있습니까?

답변

0

DragDropScatterView.csdragSourceScatterViewItem에 저장해야 나중에 활성화 할 수 있습니다. 지금은 dragSource을 가지고 있기 때문에,

private void OnCursorDrop(object sender, SurfaceDragDropEventArgs args) { 
    (...) 
    svi.Tag = droppingCursor.DragSource; 
    (...) 
} 

그리고 내 첫 번째 게시물에 표시되는 코드의 첫 번째 부분을 사용할 수 있습니다이 방법 : 그래서 나는 다음과 같은 코드를 추가합니다.