diff --git a/src/Avalonia.Controls/Carousel.cs b/src/Avalonia.Controls/Carousel.cs index 84601e8690..1e0405dab4 100644 --- a/src/Avalonia.Controls/Carousel.cs +++ b/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 for /// . /// - private static readonly ITemplate PanelTemplate = - new FuncTemplate(() => new VirtualizingCarouselPanel()); + private static readonly FuncTemplate DefaultPanel = + new(() => new VirtualizingCarouselPanel()); private IScrollable? _scroller; @@ -31,7 +30,7 @@ namespace Avalonia.Controls static Carousel() { SelectionModeProperty.OverrideDefaultValue(SelectionMode.AlwaysSelected); - ItemsPanelProperty.OverrideDefaultValue(PanelTemplate); + ItemsPanelProperty.OverrideDefaultValue(DefaultPanel); } /// diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index f6e4b32d6b..1234b66383 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/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 /// /// The default value for the property. /// - private static readonly FuncTemplate DefaultPanel = - new FuncTemplate(() => new VirtualizingStackPanel()); + private static readonly FuncTemplate DefaultPanel = + new(() => new VirtualizingStackPanel()); /// /// Defines the property. diff --git a/src/Avalonia.Controls/ContextMenu.cs b/src/Avalonia.Controls/ContextMenu.cs index f46594ff96..fc4b11bd4a 100644 --- a/src/Avalonia.Controls/ContextMenu.cs +++ b/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 PlacementTargetProperty = Popup.PlacementTargetProperty.AddOwner(); - private static readonly ITemplate DefaultPanel = - new FuncTemplate(() => new StackPanel { Orientation = Orientation.Vertical }); + private static readonly FuncTemplate DefaultPanel = + new(() => new StackPanel { Orientation = Orientation.Vertical }); private Popup? _popup; private List? _attachedControls; private IInputElement? _previousFocus; diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs index 4460ff0486..1123f42afa 100644 --- a/src/Avalonia.Controls/ItemsControl.cs +++ b/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 /// /// The default value for the property. /// - private static readonly FuncTemplate DefaultPanel = - new FuncTemplate(() => new StackPanel()); + private static readonly FuncTemplate DefaultPanel = + new(() => new StackPanel()); /// /// Defines the property. @@ -58,8 +56,8 @@ namespace Avalonia.Controls /// /// Defines the property. /// - public static readonly StyledProperty> ItemsPanelProperty = - AvaloniaProperty.Register>(nameof(ItemsPanel), DefaultPanel); + public static readonly StyledProperty> ItemsPanelProperty = + AvaloniaProperty.Register>(nameof(ItemsPanel), DefaultPanel); /// /// Defines the property. @@ -202,7 +200,7 @@ namespace Avalonia.Controls /// /// Gets or sets the panel used to display the items. /// - public ITemplate ItemsPanel + public ITemplate ItemsPanel { get => GetValue(ItemsPanelProperty); set => SetValue(ItemsPanelProperty, value); diff --git a/src/Avalonia.Controls/ListBox.cs b/src/Avalonia.Controls/ListBox.cs index 80d1677c2f..e665c2db90 100644 --- a/src/Avalonia.Controls/ListBox.cs +++ b/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 /// /// The default value for the property. /// - private static readonly FuncTemplate DefaultPanel = - new FuncTemplate(() => new VirtualizingStackPanel()); + private static readonly FuncTemplate DefaultPanel = + new(() => new VirtualizingStackPanel()); /// /// Defines the property. diff --git a/src/Avalonia.Controls/Menu.cs b/src/Avalonia.Controls/Menu.cs index dbdcad8217..ac0262c9b2 100644 --- a/src/Avalonia.Controls/Menu.cs +++ b/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 /// public class Menu : MenuBase, IMainMenu { - private static readonly ITemplate DefaultPanel = - new FuncTemplate(() => new StackPanel { Orientation = Orientation.Horizontal }); - + private static readonly FuncTemplate DefaultPanel = + new (() => new StackPanel { Orientation = Orientation.Horizontal }); /// /// Initializes a new instance of the class. diff --git a/src/Avalonia.Controls/MenuItem.cs b/src/Avalonia.Controls/MenuItem.cs index 03e3444d71..06d84e715d 100644 --- a/src/Avalonia.Controls/MenuItem.cs +++ b/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 /// /// The default value for the property. /// - private static readonly ITemplate DefaultPanel = - new FuncTemplate(() => new StackPanel()); + private static readonly FuncTemplate DefaultPanel = + new(() => new StackPanel()); private bool _commandCanExecute = true; private bool _commandBindingError; diff --git a/src/Avalonia.Controls/Presenters/ItemsPresenter.cs b/src/Avalonia.Controls/Presenters/ItemsPresenter.cs index a0020a0b6e..88d1e10ba4 100644 --- a/src/Avalonia.Controls/Presenters/ItemsPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ItemsPresenter.cs @@ -16,7 +16,7 @@ namespace Avalonia.Controls.Presenters /// /// Defines the property. /// - public static readonly StyledProperty> ItemsPanelProperty = + public static readonly StyledProperty> ItemsPanelProperty = ItemsControl.ItemsPanelProperty.AddOwner(); private PanelContainerGenerator? _generator; @@ -68,7 +68,7 @@ namespace Avalonia.Controls.Presenters /// /// Gets or sets a template which creates the used to display the items. /// - public ITemplate ItemsPanel + public ITemplate 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) => { diff --git a/src/Avalonia.Controls/Primitives/TabStrip.cs b/src/Avalonia.Controls/Primitives/TabStrip.cs index b8790d2a44..25cd1cd65b 100644 --- a/src/Avalonia.Controls/Primitives/TabStrip.cs +++ b/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 DefaultPanel = - new FuncTemplate(() => new WrapPanel { Orientation = Orientation.Horizontal }); + private static readonly FuncTemplate DefaultPanel = + new(() => new WrapPanel { Orientation = Orientation.Horizontal }); static TabStrip() { diff --git a/src/Avalonia.Controls/TabControl.cs b/src/Avalonia.Controls/TabControl.cs index f12a66a4e6..74cf54beb8 100644 --- a/src/Avalonia.Controls/TabControl.cs +++ b/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 /// /// The default value for the property. /// - private static readonly FuncTemplate DefaultPanel = - new FuncTemplate(() => new WrapPanel()); + private static readonly FuncTemplate DefaultPanel = + new(() => new WrapPanel()); /// /// Initializes static members of the class. diff --git a/src/Avalonia.Controls/Templates/FuncTemplate`1.cs b/src/Avalonia.Controls/Templates/FuncTemplate`1.cs index 61da607a38..aa8fa43be9 100644 --- a/src/Avalonia.Controls/Templates/FuncTemplate`1.cs +++ b/src/Avalonia.Controls/Templates/FuncTemplate`1.cs @@ -7,7 +7,7 @@ namespace Avalonia.Controls.Templates /// Creates a control from a . /// /// The type of control. - public class FuncTemplate : ITemplate where TControl : Control + public class FuncTemplate : ITemplate where TControl : Control? { private readonly Func _func; @@ -31,6 +31,6 @@ namespace Avalonia.Controls.Templates return _func(); } - object ITemplate.Build() => Build(); + object? ITemplate.Build() => Build(); } } diff --git a/src/Avalonia.Controls/TreeViewItem.cs b/src/Avalonia.Controls/TreeViewItem.cs index 3ac157f727..cf83ba8253 100644 --- a/src/Avalonia.Controls/TreeViewItem.cs +++ b/src/Avalonia.Controls/TreeViewItem.cs @@ -40,8 +40,8 @@ namespace Avalonia.Controls AvaloniaProperty.RegisterDirect( nameof(Level), o => o.Level); - private static readonly ITemplate DefaultPanel = - new FuncTemplate(() => new StackPanel()); + private static readonly FuncTemplate DefaultPanel = + new(() => new StackPanel()); private TreeView? _treeView; private Control? _header; diff --git a/src/Markup/Avalonia.Markup.Xaml/Extensions.cs b/src/Markup/Avalonia.Markup.Xaml/Extensions.cs index bbaf6e4074..8d226189dd 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Extensions.cs +++ b/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(); + var tr = ctx.GetRequiredService(); 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) diff --git a/src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionParser.cs b/src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionParser.cs index 392d10933f..8124d73a3f 100644 --- a/src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionParser.cs +++ b/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? _typeResolver; + private readonly Func? _typeResolver; private readonly INameScope? _nameScope; public ExpressionParser(bool enableValidation, Func? 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) {