From c3220b92f1ea5d57bc80f0e7c9ecd6e452c83838 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 6 Jul 2016 00:22:41 +0200 Subject: [PATCH] Don't try to show non-materialized item. Also added null checks for all ControlExtension methods. Fixes #578. --- src/Avalonia.Controls/ControlExtensions.cs | 13 +++++++++++++ .../Presenters/ItemVirtualizerNone.cs | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/ControlExtensions.cs b/src/Avalonia.Controls/ControlExtensions.cs index 0b15835b19..60a940627f 100644 --- a/src/Avalonia.Controls/ControlExtensions.cs +++ b/src/Avalonia.Controls/ControlExtensions.cs @@ -20,6 +20,8 @@ namespace Avalonia.Controls /// The control. public static void BringIntoView(this IControl control) { + Contract.Requires(control != null); + control.BringIntoView(new Rect(control.Bounds.Size)); } @@ -30,6 +32,8 @@ namespace Avalonia.Controls /// The area of the control to being into view. public static void BringIntoView(this IControl control, Rect rect) { + Contract.Requires(control != null); + var ev = new RequestBringIntoViewEventArgs { RoutedEvent = Control.RequestBringIntoViewEvent, @@ -49,6 +53,9 @@ namespace Avalonia.Controls /// The control or null if not found. public static T FindControl(this IControl control, string name) where T : class, IControl { + Contract.Requires(control != null); + Contract.Requires(name != null); + var nameScope = control.FindNameScope(); if (nameScope == null) @@ -66,6 +73,8 @@ namespace Avalonia.Controls /// The control's name scope, or null if not found. public static INameScope FindNameScope(this IControl control) { + Contract.Requires(control != null); + return control.GetSelfAndLogicalAncestors() .OfType() .Select(x => (x as INameScope) ?? NameScope.GetNameScope(x)) @@ -80,6 +89,8 @@ namespace Avalonia.Controls /// True to add the pseudoclass or false to remove. public static void Set(this IPseudoClasses classes, string name, bool value) { + Contract.Requires(classes != null); + if (value) { classes.Add(name); @@ -99,6 +110,8 @@ namespace Avalonia.Controls /// A disposable used to cancel the subscription. public static IDisposable Set(this IPseudoClasses classes, string name, IObservable trigger) { + Contract.Requires(classes != null); + return trigger.Subscribe(x => classes.Set(name, x)); } } diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs index 411f309368..8947b30e63 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs @@ -123,7 +123,7 @@ namespace Avalonia.Controls.Presenters if (index != -1) { var container = Owner.ItemContainerGenerator.ContainerFromIndex(index); - container.BringIntoView(); + container?.BringIntoView(); } } }