Browse Source

Addressed feedback on PR #10608

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

7
src/Avalonia.Controls/ComboBox.cs

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

5
src/Avalonia.Controls/ContextMenu.cs

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

12
src/Avalonia.Controls/ItemsControl.cs

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

7
src/Avalonia.Controls/ListBox.cs

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

6
src/Avalonia.Controls/Menu.cs

@ -1,7 +1,6 @@
using Avalonia.Automation;
using Avalonia.Automation.Peers;
using Avalonia.Controls.Platform;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.Input;
using Avalonia.Interactivity;
@ -14,9 +13,8 @@ namespace Avalonia.Controls
/// </summary>
public class Menu : MenuBase, IMainMenu
{
private static readonly ITemplate<Panel> DefaultPanel =
new FuncTemplate<Panel>(() => new StackPanel { Orientation = Orientation.Horizontal });
private static readonly FuncTemplate<Panel?> DefaultPanel =
new (() => new StackPanel { Orientation = Orientation.Horizontal });
/// <summary>
/// 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 System.Windows.Input;
using Avalonia.Automation.Peers;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Mixins;
using Avalonia.Controls.Primitives;
@ -107,8 +106,8 @@ namespace Avalonia.Controls
/// <summary>
/// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
/// </summary>
private static readonly ITemplate<Panel> DefaultPanel =
new FuncTemplate<Panel>(() => new StackPanel());
private static readonly FuncTemplate<Panel?> DefaultPanel =
new(() => new StackPanel());
private bool _commandCanExecute = true;
private bool _commandBindingError;

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

@ -16,7 +16,7 @@ namespace Avalonia.Controls.Presenters
/// <summary>
/// Defines the <see cref="ItemsPanel"/> property.
/// </summary>
public static readonly StyledProperty<ITemplate<Panel>> ItemsPanelProperty =
public static readonly StyledProperty<ITemplate<Panel?>> ItemsPanelProperty =
ItemsControl.ItemsPanelProperty.AddOwner<ItemsPresenter>();
private PanelContainerGenerator? _generator;
@ -68,7 +68,7 @@ namespace Avalonia.Controls.Presenters
/// <summary>
/// Gets or sets a template which creates the <see cref="Panel"/> used to display the items.
/// </summary>
public ITemplate<Panel> ItemsPanel
public ITemplate<Panel?> ItemsPanel
{
get => GetValue(ItemsPanelProperty);
set => SetValue(ItemsPanelProperty, value);
@ -166,6 +166,12 @@ namespace Avalonia.Controls.Presenters
}
Panel = ItemsPanel.Build();
if (Panel is null)
{
return;
}
Panel.TemplatedParent = TemplatedParent;
Panel.IsItemsHost = true;
_scrollSnapPointsInfo = Panel as IScrollSnapPointsInfo;
@ -183,7 +189,7 @@ namespace Avalonia.Controls.Presenters
else
CreateSimplePanelGenerator();
if(Panel is IScrollSnapPointsInfo scrollSnapPointsInfo)
if (Panel is IScrollSnapPointsInfo scrollSnapPointsInfo)
{
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.Input;
using Avalonia.Layout;
using Avalonia.VisualTree;
namespace Avalonia.Controls.Primitives
{
public class TabStrip : SelectingItemsControl
{
private static readonly FuncTemplate<Panel> DefaultPanel =
new FuncTemplate<Panel>(() => new WrapPanel { Orientation = Orientation.Horizontal });
private static readonly FuncTemplate<Panel?> DefaultPanel =
new(() => new WrapPanel { Orientation = Orientation.Horizontal });
static TabStrip()
{

7
src/Avalonia.Controls/TabControl.cs

@ -1,8 +1,6 @@
using System.ComponentModel;
using System.Linq;
using Avalonia.Collections;
using Avalonia.Automation.Peers;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
@ -12,7 +10,6 @@ using Avalonia.LogicalTree;
using Avalonia.VisualTree;
using Avalonia.Automation;
using Avalonia.Controls.Metadata;
using Avalonia.Data;
namespace Avalonia.Controls
{
@ -61,8 +58,8 @@ namespace Avalonia.Controls
/// <summary>
/// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
/// </summary>
private static readonly FuncTemplate<Panel> DefaultPanel =
new FuncTemplate<Panel>(() => new WrapPanel());
private static readonly FuncTemplate<Panel?> DefaultPanel =
new(() => new WrapPanel());
/// <summary>
/// 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}"/>.
/// </summary>
/// <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;
@ -31,6 +31,6 @@ namespace Avalonia.Controls.Templates
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>(
nameof(Level), o => o.Level);
private static readonly ITemplate<Panel> DefaultPanel =
new FuncTemplate<Panel>(() => new StackPanel());
private static readonly FuncTemplate<Panel?> DefaultPanel =
new(() => new StackPanel());
private TreeView? _treeView;
private Control? _header;

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

@ -31,9 +31,9 @@ namespace Avalonia.Markup.Xaml
[RequiresUnreferencedCode(TrimmingMessages.XamlTypeResolvedRequiresUnreferenceCodeMessage)]
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}";
return tr?.Resolve(name) ?? throw new XamlLoadException($"Could not find type '{name}'.");
return tr.Resolve(name);
}
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
{
private readonly bool _enableValidation;
private readonly Func<string, string, Type>? _typeResolver;
private readonly Func<string?, string, Type>? _typeResolver;
private readonly INameScope? _nameScope;
public ExpressionParser(bool enableValidation, Func<string?, string, Type>? typeResolver, INameScope? nameScope)
@ -88,7 +88,7 @@ namespace Avalonia.Markup.Parsers
Type? ancestorType = null;
var ancestorLevel = node.Level;
if (!(node.Namespace is null) && !(node.TypeName is null))
if (!string.IsNullOrEmpty(node.TypeName))
{
if (_typeResolver == null)
{
@ -104,7 +104,7 @@ namespace Avalonia.Markup.Parsers
private TypeCastNode ParseTypeCastNode(BindingExpressionGrammar.TypeCastNode node)
{
Type? castType = null;
if (!(node.Namespace is null) && !(node.TypeName is null))
if (!string.IsNullOrEmpty(node.TypeName))
{
if (_typeResolver == null)
{

Loading…
Cancel
Save