Browse Source

Fix properties that affect measure/render etc

pull/4/head
Steven Kirk 12 years ago
parent
commit
d9b0876522
  1. 13
      Perspex.Windows/Window.cs
  2. 8
      Perspex/Controls/Border.cs
  3. 37
      Perspex/Controls/Control.cs
  4. 4
      Perspex/Controls/TextBlock.cs
  5. 6
      Perspex/PerspexObject.cs
  6. 20
      Perspex/PerspexProperty.cs
  7. 8
      Perspex/PerspexPropertyChangedEventArgs.cs
  8. 19
      Perspex/Visual.cs

13
Perspex.Windows/Window.cs

@ -10,6 +10,7 @@ namespace Perspex.Windows
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reactive.Linq;
using System.Runtime.InteropServices;
using Perspex.Controls;
using Perspex.Input;
@ -32,6 +33,8 @@ namespace Perspex.Windows
private IInputManager inputManager;
private bool layoutPending;
static Window()
{
FontSizeProperty.OverrideDefaultValue(typeof(Window), 18.0);
@ -51,22 +54,28 @@ namespace Perspex.Windows
this.LayoutManager.LayoutNeeded.Subscribe(x =>
{
this.layoutPending = true;
Dispatcher.CurrentDispatcher.BeginInvoke(
DispatcherPriority.Render,
() =>
{
this.LayoutManager.ExecuteLayoutPass();
this.renderer.Render(this);
this.layoutPending = false;
});
});
this.RenderManager.RenderNeeded.Subscribe(x =>
this.RenderManager.RenderNeeded
.Subscribe(x =>
{
Dispatcher.CurrentDispatcher.BeginInvoke(
DispatcherPriority.Render,
() =>
{
this.renderer.Render(this);
if (!this.layoutPending)
{
this.renderer.Render(this);
}
});
});
}

8
Perspex/Controls/Border.cs

@ -13,12 +13,10 @@ namespace Perspex.Controls
public class Border : Decorator
{
public Border()
static Border()
{
Observable.Merge(
this.GetObservable(BackgroundProperty),
this.GetObservable(BorderBrushProperty))
.Subscribe(_ => this.InvalidateVisual());
AffectsRender(BackgroundProperty);
AffectsRender(BorderBrushProperty);
}
public override void Render(IDrawingContext context)

37
Perspex/Controls/Control.cs

@ -119,6 +119,11 @@ namespace Perspex.Controls
private Styles styles;
static Control()
{
AffectsMeasure(IsVisibleProperty);
}
public Control()
{
this.classes = new Classes();
@ -128,8 +133,6 @@ namespace Perspex.Controls
this.PointerLeave += (s, e) => this.IsPointerOver = false;
this.AddPseudoClass(IsPointerOverProperty, ":pointerover");
this.AddPseudoClass(IsFocusedProperty, ":focus");
this.GetObservable(IsVisibleProperty).Subscribe(_ => this.InvalidateMeasure());
}
public event EventHandler<RoutedEventArgs> GotFocus
@ -368,6 +371,36 @@ namespace Perspex.Controls
get { return Enumerable.Empty<ILogical>(); }
}
protected static void AffectsArrange(PerspexProperty property)
{
property.Changed.Subscribe(AffectsArrangeInvalidate);
}
protected static void AffectsMeasure(PerspexProperty property)
{
property.Changed.Subscribe(AffectsMeasureInvalidate);
}
private static void AffectsArrangeInvalidate(PerspexPropertyChangedEventArgs e)
{
Control control = e.Sender as Control;
if (control != null)
{
control.InvalidateArrange();
}
}
private static void AffectsMeasureInvalidate(PerspexPropertyChangedEventArgs e)
{
Control control = e.Sender as Control;
if (control != null)
{
control.InvalidateMeasure();
}
}
public ILayoutRoot GetLayoutRoot()
{
return this.GetVisualAncestorOrSelf<ILayoutRoot>();

4
Perspex/Controls/TextBlock.cs

@ -16,9 +16,9 @@ namespace Perspex.Controls
public static readonly PerspexProperty<string> TextProperty =
PerspexProperty.Register<TextBlock, string>("Text");
public TextBlock()
static TextBlock()
{
this.GetObservable(TextProperty).Subscribe(_ => this.InvalidateVisual());
AffectsRender(TextProperty);
}
public string Text

6
Perspex/PerspexObject.cs

@ -548,9 +548,9 @@ namespace Perspex
if (this.PropertyChanged != null)
{
this.PropertyChanged(
this,
new PerspexPropertyChangedEventArgs(property, oldValue, newValue));
PerspexPropertyChangedEventArgs e = new PerspexPropertyChangedEventArgs(this, property, oldValue, newValue);
property.NotifyChanged(e);
this.PropertyChanged(this, e);
}
}
}

20
Perspex/PerspexProperty.cs

@ -9,6 +9,7 @@ namespace Perspex
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Subjects;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
@ -31,6 +32,11 @@ namespace Perspex
/// </summary>
private Dictionary<Type, object> defaultValues = new Dictionary<Type, object>();
/// <summary>
/// Observable fired when this property changes on any <see cref="PerspexObject"/>.
/// </summary>
private Subject<PerspexPropertyChangedEventArgs> changed = new Subject<PerspexPropertyChangedEventArgs>();
/// <summary>
/// Initializes a new instance of the <see cref="PerspexProperty"/> class.
/// </summary>
@ -77,6 +83,15 @@ namespace Perspex
/// </summary>
public bool Inherits { get; private set; }
/// <summary>
/// Gets an observable that is fired when this property changes on any
/// <see cref="PerspexObject"/> instance.
/// </summary>
public IObservable<PerspexPropertyChangedEventArgs> Changed
{
get { return this.changed; }
}
/// <summary>
/// Registers a <see cref="PerspexProperty"/>.
/// </summary>
@ -219,6 +234,11 @@ namespace Perspex
return this.Name;
}
internal void NotifyChanged(PerspexPropertyChangedEventArgs e)
{
this.changed.OnNext(e);
}
public class BindingAccessor
{
public BindingAccessor(PerspexProperty property, BindingPriority priority)

8
Perspex/PerspexPropertyChangedEventArgs.cs

@ -18,15 +18,23 @@ namespace Perspex
public class PerspexPropertyChangedEventArgs
{
public PerspexPropertyChangedEventArgs(
PerspexObject sender,
PerspexProperty property,
object oldValue,
object newValue)
{
this.Sender = sender;
this.Property = property;
this.OldValue = oldValue;
this.NewValue = newValue;
}
/// <summary>
/// Gets the <see cref="PerspexObject"/> that the property changed on.
/// </summary>
/// <returns></returns>
public PerspexObject Sender { get; private set; }
/// <summary>
/// Gets the property that changed.
/// </summary>

19
Perspex/Visual.cs

@ -23,9 +23,9 @@ namespace Perspex
private Rect bounds;
public Visual()
static Visual()
{
this.GetObservable(IsVisibleProperty).Subscribe(_ => this.InvalidateVisual());
AffectsRender(IsVisibleProperty);
}
public bool IsVisible
@ -74,6 +74,21 @@ namespace Perspex
}
}
protected static void AffectsRender(PerspexProperty property)
{
property.Changed.Subscribe(AffectsRenderInvalidate);
}
private static void AffectsRenderInvalidate(PerspexPropertyChangedEventArgs e)
{
Visual visual = e.Sender as Visual;
if (visual != null)
{
visual.InvalidateVisual();
}
}
public void InvalidateVisual()
{
IRendered root = this.GetVisualAncestorOrSelf<IRendered>();

Loading…
Cancel
Save