You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.9 KiB

namespace GummingCommon
{
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
public enum SelectiveScrollingOrientation
{
None,
Horizontal,
Vertical,
Both
}
public static class ListViewHelper
{
/// <summary>
/// Okay, I know this methods cause stack overflow.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="element"></param>
/// <returns></returns>
public static T FindAncestor<T>(this DependencyObject element)
where T : DependencyObject
{
if (element == null)
{
return null;
}
DependencyObject ancestor = VisualTreeHelper.GetParent(element);
if (element is FrameworkElement)
{
ancestor = ancestor ?? ((element as FrameworkElement).Parent ?? (element as FrameworkElement).TemplatedParent);
}
return ancestor is T ? ancestor as T : FindAncestor<T>(ancestor);
}
}
public class FixedScrollingGridView : Grid
{
public static SelectiveScrollingOrientation GetSelectiveScrollingOrientation(DependencyObject obj)
{
return (SelectiveScrollingOrientation)obj.GetValue(SelectiveScrollingOrientationProperty);
}
public static void SetSelectiveScrollingOrientation(DependencyObject obj, SelectiveScrollingOrientation value)
{
obj.SetValue(SelectiveScrollingOrientationProperty, value);
}
// Using a DependencyProperty as the backing store for SelectiveScrollingOrientation. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectiveScrollingOrientationProperty =
DependencyProperty.RegisterAttached("SelectiveScrollingOrientation", typeof(SelectiveScrollingOrientation), typeof(FixedScrollingGridView), new UIPropertyMetadata(SelectiveScrollingOrientation.Both, new PropertyChangedCallback(OnSelectiveScrollingOrientationChanged)));
private static void OnSelectiveScrollingOrientationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
UIElement element = d as UIElement;
SelectiveScrollingOrientation newValue = (SelectiveScrollingOrientation)e.NewValue;
ScrollViewer viewer = element.FindAncestor<ScrollViewer>();
if ((viewer != null) && (element != null))
{
Transform renderTransform = element.RenderTransform;
if (renderTransform != null)
{
BindingOperations.ClearBinding(renderTransform, TranslateTransform.XProperty);
BindingOperations.ClearBinding(renderTransform, TranslateTransform.YProperty);
}
if (newValue == SelectiveScrollingOrientation.Both)
{
element.RenderTransform = null;
}
else
{
TranslateTransform target = new TranslateTransform();
if (newValue != SelectiveScrollingOrientation.Horizontal)
{
Binding binding = new Binding("ContentHorizontalOffset");
binding.Source = viewer;
BindingOperations.SetBinding(target, TranslateTransform.XProperty, binding);
}
if (newValue != SelectiveScrollingOrientation.Vertical)
{
Binding binding2 = new Binding("ContentVerticalOffset");
binding2.Source = viewer;
BindingOperations.SetBinding(target, TranslateTransform.YProperty, binding2);
}
element.RenderTransform = target;
}
}
}
}
}