Browse Source

Addressed feedback on PR #10608

pull/10608/head
Julien Lebosquain 4 years ago
parent
commit
aa55ad2329
No known key found for this signature in database GPG Key ID: 1833CAD10ACC46FD
  1. 7
      src/Avalonia.Controls/Carousel.cs
  2. 7
      src/Avalonia.Controls/ComboBox.cs
  3. 5
      src/Avalonia.Controls/ContextMenu.cs
  4. 12
      src/Avalonia.Controls/ItemsControl.cs
  5. 7
      src/Avalonia.Controls/ListBox.cs
  6. 6
      src/Avalonia.Controls/Menu.cs
  7. 5
      src/Avalonia.Controls/MenuItem.cs
  8. 12
      src/Avalonia.Controls/Presenters/ItemsPresenter.cs
  9. 6
      src/Avalonia.Controls/Primitives/TabStrip.cs
  10. 7
      src/Avalonia.Controls/TabControl.cs
  11. 4
      src/Avalonia.Controls/Templates/FuncTemplate`1.cs
  12. 4
      src/Avalonia.Controls/TreeViewItem.cs
  13. 4
      src/Markup/Avalonia.Markup.Xaml/Extensions.cs
  14. 6
      src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionParser.cs

7
src/Avalonia.Controls/Carousel.cs

@ -1,7 +1,6 @@
using Avalonia.Animation; using Avalonia.Animation;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Controls.Utils;
namespace Avalonia.Controls namespace Avalonia.Controls
{ {
@ -20,8 +19,8 @@ namespace Avalonia.Controls
/// The default value of <see cref="ItemsControl.ItemsPanelProperty"/> for /// The default value of <see cref="ItemsControl.ItemsPanelProperty"/> for
/// <see cref="Carousel"/>. /// <see cref="Carousel"/>.
/// </summary> /// </summary>
private static readonly ITemplate<Panel> PanelTemplate = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new VirtualizingCarouselPanel()); new(() => new VirtualizingCarouselPanel());
private IScrollable? _scroller; private IScrollable? _scroller;
@ -31,7 +30,7 @@ namespace Avalonia.Controls
static Carousel() static Carousel()
{ {
SelectionModeProperty.OverrideDefaultValue<Carousel>(SelectionMode.AlwaysSelected); SelectionModeProperty.OverrideDefaultValue<Carousel>(SelectionMode.AlwaysSelected);
ItemsPanelProperty.OverrideDefaultValue<Carousel>(PanelTemplate); ItemsPanelProperty.OverrideDefaultValue<Carousel>(DefaultPanel);
} }
/// <summary> /// <summary>

7
src/Avalonia.Controls/ComboBox.cs

@ -1,13 +1,10 @@
using System; using System;
using System.Diagnostics;
using System.Linq; using System.Linq;
using Avalonia.Automation.Peers; using Avalonia.Automation.Peers;
using Avalonia.Controls.Metadata; using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Selection;
using Avalonia.Controls.Shapes; using Avalonia.Controls.Shapes;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Controls.Utils;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Layout; using Avalonia.Layout;
@ -29,8 +26,8 @@ namespace Avalonia.Controls
/// <summary> /// <summary>
/// The default value for the <see cref="ItemsControl.ItemsPanel"/> property. /// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
/// </summary> /// </summary>
private static readonly FuncTemplate<Panel> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new VirtualizingStackPanel()); new(() => new VirtualizingStackPanel());
/// <summary> /// <summary>
/// Defines the <see cref="IsDropDownOpen"/> property. /// Defines the <see cref="IsDropDownOpen"/> property.

5
src/Avalonia.Controls/ContextMenu.cs

@ -4,7 +4,6 @@ using System.ComponentModel;
using Avalonia.Automation.Peers; using Avalonia.Automation.Peers;
using System.Linq; using System.Linq;
using Avalonia.Controls.Diagnostics; using Avalonia.Controls.Diagnostics;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Platform; using Avalonia.Controls.Platform;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Primitives.PopupPositioning; using Avalonia.Controls.Primitives.PopupPositioning;
@ -84,8 +83,8 @@ namespace Avalonia.Controls
public static readonly StyledProperty<Control?> PlacementTargetProperty = public static readonly StyledProperty<Control?> PlacementTargetProperty =
Popup.PlacementTargetProperty.AddOwner<ContextMenu>(); Popup.PlacementTargetProperty.AddOwner<ContextMenu>();
private static readonly ITemplate<Panel> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new StackPanel { Orientation = Orientation.Vertical }); new(() => new StackPanel { Orientation = Orientation.Vertical });
private Popup? _popup; private Popup? _popup;
private List<Control>? _attachedControls; private List<Control>? _attachedControls;
private IInputElement? _previousFocus; private IInputElement? _previousFocus;

12
src/Avalonia.Controls/ItemsControl.cs

@ -2,9 +2,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Diagnostics.CodeAnalysis;
using Avalonia.Automation.Peers; using Avalonia.Automation.Peers;
using Avalonia.Collections;
using Avalonia.Controls.Generators; using Avalonia.Controls.Generators;
using Avalonia.Controls.Metadata; using Avalonia.Controls.Metadata;
using Avalonia.Controls.Presenters; using Avalonia.Controls.Presenters;
@ -29,8 +27,8 @@ namespace Avalonia.Controls
/// <summary> /// <summary>
/// The default value for the <see cref="ItemsPanel"/> property. /// The default value for the <see cref="ItemsPanel"/> property.
/// </summary> /// </summary>
private static readonly FuncTemplate<Panel> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new StackPanel()); new(() => new StackPanel());
/// <summary> /// <summary>
/// Defines the <see cref="Items"/> property. /// Defines the <see cref="Items"/> property.
@ -58,8 +56,8 @@ namespace Avalonia.Controls
/// <summary> /// <summary>
/// Defines the <see cref="ItemsPanel"/> property. /// Defines the <see cref="ItemsPanel"/> property.
/// </summary> /// </summary>
public static readonly StyledProperty<ITemplate<Panel>> ItemsPanelProperty = public static readonly StyledProperty<ITemplate<Panel?>> ItemsPanelProperty =
AvaloniaProperty.Register<ItemsControl, ITemplate<Panel>>(nameof(ItemsPanel), DefaultPanel); AvaloniaProperty.Register<ItemsControl, ITemplate<Panel?>>(nameof(ItemsPanel), DefaultPanel);
/// <summary> /// <summary>
/// Defines the <see cref="ItemsSource"/> property. /// Defines the <see cref="ItemsSource"/> property.
@ -202,7 +200,7 @@ namespace Avalonia.Controls
/// <summary> /// <summary>
/// Gets or sets the panel used to display the items. /// Gets or sets the panel used to display the items.
/// </summary> /// </summary>
public ITemplate<Panel> ItemsPanel public ITemplate<Panel?> ItemsPanel
{ {
get => GetValue(ItemsPanelProperty); get => GetValue(ItemsPanelProperty);
set => SetValue(ItemsPanelProperty, value); set => SetValue(ItemsPanelProperty, value);

7
src/Avalonia.Controls/ListBox.cs

@ -1,13 +1,10 @@
using System.Collections; using System.Collections;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Metadata; using Avalonia.Controls.Metadata;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Selection; using Avalonia.Controls.Selection;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Input.Platform; using Avalonia.Input.Platform;
using Avalonia.VisualTree;
namespace Avalonia.Controls namespace Avalonia.Controls
{ {
@ -20,8 +17,8 @@ namespace Avalonia.Controls
/// <summary> /// <summary>
/// The default value for the <see cref="ItemsControl.ItemsPanel"/> property. /// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
/// </summary> /// </summary>
private static readonly FuncTemplate<Panel> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new VirtualizingStackPanel()); new(() => new VirtualizingStackPanel());
/// <summary> /// <summary>
/// Defines the <see cref="Scroll"/> property. /// Defines the <see cref="Scroll"/> property.

6
src/Avalonia.Controls/Menu.cs

@ -1,7 +1,6 @@
using Avalonia.Automation; using Avalonia.Automation;
using Avalonia.Automation.Peers; using Avalonia.Automation.Peers;
using Avalonia.Controls.Platform; using Avalonia.Controls.Platform;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity; using Avalonia.Interactivity;
@ -14,9 +13,8 @@ namespace Avalonia.Controls
/// </summary> /// </summary>
public class Menu : MenuBase, IMainMenu public class Menu : MenuBase, IMainMenu
{ {
private static readonly ITemplate<Panel> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new StackPanel { Orientation = Orientation.Horizontal }); new (() => new StackPanel { Orientation = Orientation.Horizontal });
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="Menu"/> class. /// Initializes a new instance of the <see cref="Menu"/> class.

5
src/Avalonia.Controls/MenuItem.cs

@ -4,7 +4,6 @@ using System.Linq;
using Avalonia.Reactive; using Avalonia.Reactive;
using System.Windows.Input; using System.Windows.Input;
using Avalonia.Automation.Peers; using Avalonia.Automation.Peers;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Metadata; using Avalonia.Controls.Metadata;
using Avalonia.Controls.Mixins; using Avalonia.Controls.Mixins;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
@ -107,8 +106,8 @@ namespace Avalonia.Controls
/// <summary> /// <summary>
/// The default value for the <see cref="ItemsControl.ItemsPanel"/> property. /// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
/// </summary> /// </summary>
private static readonly ITemplate<Panel> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new StackPanel()); new(() => new StackPanel());
private bool _commandCanExecute = true; private bool _commandCanExecute = true;
private bool _commandBindingError; private bool _commandBindingError;

12
src/Avalonia.Controls/Presenters/ItemsPresenter.cs

@ -16,7 +16,7 @@ namespace Avalonia.Controls.Presenters
/// <summary> /// <summary>
/// Defines the <see cref="ItemsPanel"/> property. /// Defines the <see cref="ItemsPanel"/> property.
/// </summary> /// </summary>
public static readonly StyledProperty<ITemplate<Panel>> ItemsPanelProperty = public static readonly StyledProperty<ITemplate<Panel?>> ItemsPanelProperty =
ItemsControl.ItemsPanelProperty.AddOwner<ItemsPresenter>(); ItemsControl.ItemsPanelProperty.AddOwner<ItemsPresenter>();
private PanelContainerGenerator? _generator; private PanelContainerGenerator? _generator;
@ -68,7 +68,7 @@ namespace Avalonia.Controls.Presenters
/// <summary> /// <summary>
/// Gets or sets a template which creates the <see cref="Panel"/> used to display the items. /// Gets or sets a template which creates the <see cref="Panel"/> used to display the items.
/// </summary> /// </summary>
public ITemplate<Panel> ItemsPanel public ITemplate<Panel?> ItemsPanel
{ {
get => GetValue(ItemsPanelProperty); get => GetValue(ItemsPanelProperty);
set => SetValue(ItemsPanelProperty, value); set => SetValue(ItemsPanelProperty, value);
@ -166,6 +166,12 @@ namespace Avalonia.Controls.Presenters
} }
Panel = ItemsPanel.Build(); Panel = ItemsPanel.Build();
if (Panel is null)
{
return;
}
Panel.TemplatedParent = TemplatedParent; Panel.TemplatedParent = TemplatedParent;
Panel.IsItemsHost = true; Panel.IsItemsHost = true;
_scrollSnapPointsInfo = Panel as IScrollSnapPointsInfo; _scrollSnapPointsInfo = Panel as IScrollSnapPointsInfo;
@ -183,7 +189,7 @@ namespace Avalonia.Controls.Presenters
else else
CreateSimplePanelGenerator(); CreateSimplePanelGenerator();
if(Panel is IScrollSnapPointsInfo scrollSnapPointsInfo) if (Panel is IScrollSnapPointsInfo scrollSnapPointsInfo)
{ {
scrollSnapPointsInfo.VerticalSnapPointsChanged += (s, e) => scrollSnapPointsInfo.VerticalSnapPointsChanged += (s, e) =>
{ {

6
src/Avalonia.Controls/Primitives/TabStrip.cs

@ -1,15 +1,13 @@
using Avalonia.Controls.Generators;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Layout; using Avalonia.Layout;
using Avalonia.VisualTree;
namespace Avalonia.Controls.Primitives namespace Avalonia.Controls.Primitives
{ {
public class TabStrip : SelectingItemsControl public class TabStrip : SelectingItemsControl
{ {
private static readonly FuncTemplate<Panel> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new WrapPanel { Orientation = Orientation.Horizontal }); new(() => new WrapPanel { Orientation = Orientation.Horizontal });
static TabStrip() static TabStrip()
{ {

7
src/Avalonia.Controls/TabControl.cs

@ -1,8 +1,6 @@
using System.ComponentModel;
using System.Linq; using System.Linq;
using Avalonia.Collections; using Avalonia.Collections;
using Avalonia.Automation.Peers; using Avalonia.Automation.Peers;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Presenters; using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
@ -12,7 +10,6 @@ using Avalonia.LogicalTree;
using Avalonia.VisualTree; using Avalonia.VisualTree;
using Avalonia.Automation; using Avalonia.Automation;
using Avalonia.Controls.Metadata; using Avalonia.Controls.Metadata;
using Avalonia.Data;
namespace Avalonia.Controls namespace Avalonia.Controls
{ {
@ -61,8 +58,8 @@ namespace Avalonia.Controls
/// <summary> /// <summary>
/// The default value for the <see cref="ItemsControl.ItemsPanel"/> property. /// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
/// </summary> /// </summary>
private static readonly FuncTemplate<Panel> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new WrapPanel()); new(() => new WrapPanel());
/// <summary> /// <summary>
/// Initializes static members of the <see cref="TabControl"/> class. /// Initializes static members of the <see cref="TabControl"/> class.

4
src/Avalonia.Controls/Templates/FuncTemplate`1.cs

@ -7,7 +7,7 @@ namespace Avalonia.Controls.Templates
/// Creates a control from a <see cref="Func{TControl}"/>. /// Creates a control from a <see cref="Func{TControl}"/>.
/// </summary> /// </summary>
/// <typeparam name="TControl">The type of control.</typeparam> /// <typeparam name="TControl">The type of control.</typeparam>
public class FuncTemplate<TControl> : ITemplate<TControl> where TControl : Control public class FuncTemplate<TControl> : ITemplate<TControl> where TControl : Control?
{ {
private readonly Func<TControl> _func; private readonly Func<TControl> _func;
@ -31,6 +31,6 @@ namespace Avalonia.Controls.Templates
return _func(); return _func();
} }
object ITemplate.Build() => Build(); object? ITemplate.Build() => Build();
} }
} }

4
src/Avalonia.Controls/TreeViewItem.cs

@ -40,8 +40,8 @@ namespace Avalonia.Controls
AvaloniaProperty.RegisterDirect<TreeViewItem, int>( AvaloniaProperty.RegisterDirect<TreeViewItem, int>(
nameof(Level), o => o.Level); nameof(Level), o => o.Level);
private static readonly ITemplate<Panel> DefaultPanel = private static readonly FuncTemplate<Panel?> DefaultPanel =
new FuncTemplate<Panel>(() => new StackPanel()); new(() => new StackPanel());
private TreeView? _treeView; private TreeView? _treeView;
private Control? _header; private Control? _header;

4
src/Markup/Avalonia.Markup.Xaml/Extensions.cs

@ -31,9 +31,9 @@ namespace Avalonia.Markup.Xaml
[RequiresUnreferencedCode(TrimmingMessages.XamlTypeResolvedRequiresUnreferenceCodeMessage)] [RequiresUnreferencedCode(TrimmingMessages.XamlTypeResolvedRequiresUnreferenceCodeMessage)]
public static Type ResolveType(this IServiceProvider ctx, string? namespacePrefix, string type) public static Type ResolveType(this IServiceProvider ctx, string? namespacePrefix, string type)
{ {
var tr = ctx.GetService<IXamlTypeResolver>(); var tr = ctx.GetRequiredService<IXamlTypeResolver>();
string name = string.IsNullOrEmpty(namespacePrefix) ? type : $"{namespacePrefix}:{type}"; string name = string.IsNullOrEmpty(namespacePrefix) ? type : $"{namespacePrefix}:{type}";
return tr?.Resolve(name) ?? throw new XamlLoadException($"Could not find type '{name}'."); return tr.Resolve(name);
} }
public static object? GetDefaultAnchor(this IServiceProvider provider) public static object? GetDefaultAnchor(this IServiceProvider provider)

6
src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionParser.cs

@ -13,7 +13,7 @@ namespace Avalonia.Markup.Parsers
internal class ExpressionParser internal class ExpressionParser
{ {
private readonly bool _enableValidation; private readonly bool _enableValidation;
private readonly Func<string, string, Type>? _typeResolver; private readonly Func<string?, string, Type>? _typeResolver;
private readonly INameScope? _nameScope; private readonly INameScope? _nameScope;
public ExpressionParser(bool enableValidation, Func<string?, string, Type>? typeResolver, INameScope? nameScope) public ExpressionParser(bool enableValidation, Func<string?, string, Type>? typeResolver, INameScope? nameScope)
@ -88,7 +88,7 @@ namespace Avalonia.Markup.Parsers
Type? ancestorType = null; Type? ancestorType = null;
var ancestorLevel = node.Level; var ancestorLevel = node.Level;
if (!(node.Namespace is null) && !(node.TypeName is null)) if (!string.IsNullOrEmpty(node.TypeName))
{ {
if (_typeResolver == null) if (_typeResolver == null)
{ {
@ -104,7 +104,7 @@ namespace Avalonia.Markup.Parsers
private TypeCastNode ParseTypeCastNode(BindingExpressionGrammar.TypeCastNode node) private TypeCastNode ParseTypeCastNode(BindingExpressionGrammar.TypeCastNode node)
{ {
Type? castType = null; Type? castType = null;
if (!(node.Namespace is null) && !(node.TypeName is null)) if (!string.IsNullOrEmpty(node.TypeName))
{ {
if (_typeResolver == null) if (_typeResolver == null)
{ {

Loading…
Cancel
Save