0

タグが配置されたときに表示されるMainWindow.xamlaを持つScatterViewを持っています。TagVisualization.xamlその中にTagVisualization、という外部クラスがPhotoGallery.xaml存在する、があります。クラスを実装したので、からアイテムをドラッグして、にドロップできます。新しいものが作成されると、閉じるボタンがあります。クリックすると、アイテムがから削除され、で再度有効になるはずです。私の問題は、アイテムを再度有効にすることです。これは、に到達できないように見えるためです。LibraryBarPhotoGalleryViewModel.csDragDropScatterViewLibraryBarScatterViewScatterViewItemScatterViewLibraryBarPhotoGallery.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。つまり、表面に2つのタグがある場合のみです。それらの1つはアイテムを再度有効にし、他は何もしません。

だから私の質問は:コードの最初のチャンクを考えると、どうすればそれを私のために機能させることができますか?どうすれば、そこから自分のに到達できますかLibraryBar。つまり、ScatterViewItemPhotoGalleryViewModel)からLibraryBaraの中にあるものまで、つまり、の中TagVisualizationMainWindowあるものまで、どのように到達できScatterViewますか?

4

1 に答える 1

0

私は自分の問題をなんとか解決しました。自分をDragDropScatterView.csに保存する必要があるので、後でアクティブにすることができます。そこで、次のコードを追加します。dragSourceScatterViewItem

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

このようにして、最初の投稿に表示されたコードの最初の部分を使用できます。これで、がdragSource

于 2013-01-18T09:43:25.337 に答える