Browse Source

Use DispatcherTimer instead of animation for blinking caret. This reduces the frame rate WPF uses. The processor has to wake up less often -> computer uses less power.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5544 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
48a4203735
  1. 28
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretLayer.cs

28
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretLayer.cs

@ -10,6 +10,7 @@ using System.Windows; @@ -10,6 +10,7 @@ using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Rendering;
using ICSharpCode.AvalonEdit.Utils;
@ -21,16 +22,19 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -21,16 +22,19 @@ namespace ICSharpCode.AvalonEdit.Editing
bool isVisible;
Rect caretRectangle;
DoubleAnimationUsingKeyFrames blinkAnimation;
DispatcherTimer caretBlinkTimer = new DispatcherTimer();
bool blink;
public CaretLayer(TextView textView) : base(textView, KnownLayer.Caret)
{
this.IsHitTestVisible = false;
blinkAnimation = new DoubleAnimationUsingKeyFrames();
blinkAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(1, KeyTime.FromPercent(0)));
blinkAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(0, KeyTime.FromPercent(0.5)));
blinkAnimation.RepeatBehavior = RepeatBehavior.Forever;
caretBlinkTimer.Tick += new EventHandler(caretBlinkTimer_Tick);
}
void caretBlinkTimer_Tick(object sender, EventArgs e)
{
blink = !blink;
InvalidateVisual();
}
public void Show(Rect caretRectangle)
@ -54,16 +58,16 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -54,16 +58,16 @@ namespace ICSharpCode.AvalonEdit.Editing
{
TimeSpan blinkTime = Win32.CaretBlinkTime;
if (blinkTime.TotalMilliseconds >= 0) {
BeginAnimation(OpacityProperty, null);
// duration = 2*blink time
blinkAnimation.Duration = new Duration(blinkTime + blinkTime);
BeginAnimation(OpacityProperty, blinkAnimation);
blink = false;
caretBlinkTimer_Tick(null, null);
caretBlinkTimer.Interval = blinkTime;
caretBlinkTimer.Start();
}
}
void StopBlinkAnimation()
{
BeginAnimation(OpacityProperty, null);
caretBlinkTimer.Stop();
}
internal Brush CaretBrush;
@ -71,7 +75,7 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -71,7 +75,7 @@ namespace ICSharpCode.AvalonEdit.Editing
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
if (isVisible) {
if (isVisible && blink) {
Brush caretBrush = this.CaretBrush;
if (caretBrush == null)
caretBrush = (Brush)textView.GetValue(TextBlock.ForegroundProperty);

Loading…
Cancel
Save