Created
March 22, 2012 14:31
-
-
Save dgrunwald/2158660 to your computer and use it in GitHub Desktop.
Adorner in ScrollViewer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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