触摸源自相同LibraryBar的ScatterViewItem后重新启用LibraryBar Item

时间:2013-01-11 17:05:25

标签: c# wpf xaml pixelsense

我有一个MainWindow.xamlScatterView有一个TagVisualization.xaml,在放置标记时会显示。在TagVisualization内,我有一个PhotoGallery.xaml,其LibraryBar由一个名为PhotoGalleryViewModel.cs的外部类填充。我已经实施了DragDropScatterView课程,因此我可以拖动LibraryBar中的项目并将其放在ScatterView上。创建新ScatterViewItem时,它有一个关闭按钮。当我点击它时,该项目应该从ScatterView中移除并在LibraryBar上重新启用。我的问题是重新启用该项目,因为我似乎无法访问PhotoGallery.xaml

前段时间我有类似的东西,有人给了我以下解决方案:

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);
    }

但是,在我目前的项目中,这不起作用,因为_host.Tag始终是null。 我设法想出了这个:

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)是我无法区分不同的LibraryBar's,即如果我在表面上有两个标签,则只有其中一个会重新启用该项,其他标签则不会执行任何操作。

所以我的问题是:鉴于第一个代码块,我怎样才能让它适合我?我怎样才能从那里到达LibraryBar,即从ScatterViewItemPhotoGalleryViewModel)到LibraryBar内的TagVisualization一直走到MainWindow ,那就是,在ScatterView内有一个{{1}}?

1 个答案:

答案 0 :(得分:0)

我设法解决了我的问题,在DragDropScatterView.cs我需要将dragSource保存到ScatterViewItem,以便我以后可以激活它。所以我添加以下代码:

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

这样我可以使用第一篇文章中显示的第一部分代码,因为现在我有了dragSource