I have a MainWindow.xaml with a ScatterView which has a TagVisualization.xaml that appears when a tag is placed. Inside that TagVisualization, I have a PhotoGallery.xaml that has a LibraryBar, which is populated by an outside class called PhotoGalleryViewModel.cs. I have implemented the DragDropScatterView class so I can drag the items from the LibraryBar and drop them on the ScatterView. When a new ScatterViewItem is created it has a close button. When I click it the item is supposed to be removed from the ScatterView and re-enabled on the LibraryBar. My problem is with the re-enabling of the item, because I can’t seem to get to the PhotoGallery.xaml.
A while ago I had something similar and someone gave me the following solution:
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);
}
However, in my present project, this does not work because the _host.Tag is always null.
I managed to come up with this:
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);
}
}
But the problem with this (apart from it’s inneficiency, because I come all the way up to the TagVisualization and go all the way to get the LibraryBar) is that I can’t differentiate different LibraryBar's, i.e., if I have two tags on the surface, only one of them will get the item re-enabled, the others just don’t do aything.
So my question is: Given the first chunck of code, how can I make it work for me? How can I, from there, reach my LibraryBar, i.e., go all the way from the ScatterViewItem (PhotoGalleryViewModel) to the LibraryBar that’s inside a TagVisualization, that’s, in it’s turn, is inside a MainWindow with a ScatterView?
I managed to solve my problem, on my
DragDropScatterView.csI need to save mydragSourceto theScatterViewItem, so I can later on activate it. So I add the following code:And this way I can use the first part of code displayed on my first post, because now I have the
dragSource.