public static UIElement FindRoot(DependencyObject visual) { var parentWindow = Window.GetWindow(visual); var rootElement = parentWindow != null ? parentWindow.Content as UIElement : null; if (rootElement == null) { if (Application.Current != null && Application.Current.MainWindow != null) { rootElement = Application.Current.MainWindow.Content as UIElement; } if (rootElement == null) { rootElement = visual.GetVisualAncestor<Page>() ?? visual.GetVisualAncestor<UserControl>() as UIElement; } } // i don't want the fu... windows forms reference // if (rootElement == null) { // var elementHost = m_DragInfo.VisualSource.GetVisualAncestor<ElementHost>(); // rootElement = elementHost != null ? elementHost.Child : null; // } return rootElement; }
static void Scroll(DependencyObject o, DragEventArgs e) { ScrollViewer scrollViewer = o.GetVisualAncestor<ScrollViewer>();//o.GetVisualDescendent<ScrollViewer>(); if (scrollViewer != null) { Point position = e.GetPosition(scrollViewer); double scrollMargin = Math.Min(scrollViewer.FontSize * 4, scrollViewer.ActualHeight / 2); if (position.X >= scrollViewer.ActualWidth - scrollMargin && scrollViewer.HorizontalOffset < scrollViewer.ExtentWidth - scrollViewer.ViewportWidth) { scrollViewer.LineRight(); } else if (position.X < scrollMargin && scrollViewer.HorizontalOffset > 0) { scrollViewer.LineLeft(); } else if (position.Y >= scrollViewer.ActualHeight - scrollMargin && scrollViewer.VerticalOffset <= scrollViewer.ExtentHeight - scrollViewer.ViewportHeight) { scrollViewer.LineDown(); } else if (position.Y < scrollMargin && scrollViewer.VerticalOffset >= 0) { scrollViewer.LineUp(); } } }