Skip to content

Instantly share code, notes, and snippets.

@dgrunwald
Created March 22, 2012 14:31
Show Gist options
  • Save dgrunwald/2158660 to your computer and use it in GitHub Desktop.
Save dgrunwald/2158660 to your computer and use it in GitHub Desktop.
Adorner in ScrollViewer
void AddLayer(ScrollViewer scrollViewer)
{
scrollViewer.ApplyTemplate();
ScrollBar scrollBar = (ScrollBar)scrollViewer.Template.FindName("PART_VerticalScrollBar", scrollViewer);
scrollBar.ApplyTemplate();
Track track = (Track)scrollBar.Template.FindName("PART_Track", scrollBar);
var grid = VisualTreeHelper.GetParent(track) as Grid;
if (grid != null) {
var myElement = new Border();
Grid.SetColumn(myElement, Grid.GetColumn(track));
Grid.SetRow(myElement, Grid.GetRow(track));
Grid.SetColumnSpan(myElement, Grid.GetColumnSpan(track));
Grid.SetRowSpan(myElement, Grid.GetRowSpan(track));
Panel.SetZIndex(track, 1);
//myElement.Background = new SolidColorBrush(Color.FromArgb(128, 255, 0, 0));
myElement.Child = new Border {
Background = Brushes.Red,
Margin = new Thickness(3, 0, 3, 0),
Height = 2
};
myElement.IsHitTestVisible = false;
grid.Children.Add(myElement);
Thumb thumb = null;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(track); i++) {
thumb = VisualTreeHelper.GetChild(track, i) as Thumb;
if (thumb != null)
break;
}
if (thumb != null) {
thumb.Opacity = 0.7;
thumb.MouseEnter += delegate {
thumb.BeginAnimation(Track.OpacityProperty, new DoubleAnimation(1, new Duration(TimeSpan.FromSeconds(0.3)), FillBehavior.HoldEnd));
};
thumb.MouseLeave += delegate {
thumb.BeginAnimation(Track.OpacityProperty, new DoubleAnimation(0.7, new Duration(TimeSpan.FromSeconds(0.3)), FillBehavior.HoldEnd));
};
}
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(track);
if (adornerLayer != null) {
adornerLayer.Add(new TriangleRendererAdorner(track));
}
}
}
class TriangleRendererAdorner : Adorner
{
public TriangleRendererAdorner(UIElement adornedElement) : base(adornedElement)
{
}
protected override void OnRender(DrawingContext drawingContext)
{
const double triangleSize = 6.5;
var streamGeometry = new StreamGeometry();
using (var ctx = streamGeometry.Open()) {
ctx.BeginFigure(new Point(0, triangleSize / 2), true, true);
ctx.LineTo(new Point(0, -triangleSize / 2), true, false);
ctx.LineTo(new Point(triangleSize * 0.866, 0), true, false);
}
streamGeometry.Freeze();
drawingContext.PushTransform(new TranslateTransform(1, 20));
drawingContext.DrawGeometry(Brushes.Red, null, streamGeometry);
drawingContext.Pop();
drawingContext.PushTransform(new TranslateTransform(1, 35));
drawingContext.DrawGeometry(Brushes.Blue, null, streamGeometry);
drawingContext.Pop();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment