diff --git a/readme.md b/readme.md
index 5fbc5daaab..f8bbc02d07 100644
--- a/readme.md
+++ b/readme.md
@@ -26,18 +26,15 @@ Install-Package Avalonia.Desktop
## Showcase
Examples of UIs built with Avalonia
-
+
+([Lunacy](https://icons8.com/lunacy))
-([Synfonia](https://github.com/jmacato/Synfonia))
+
+([PlasticSCM](https://www.plasticscm.com/))
-
-([Xaml Control Gallery](https://github.com/AvaloniaUI/xamlcontrolsgallery))
+
+([WasabiWallet](https://www.wasabiwallet.io/))
-
-([Xaml Control Gallery](https://github.com/AvaloniaUI/xamlcontrolsgallery))
-
-
-([Xaml Control Gallery](https://github.com/AvaloniaUI/xamlcontrolsgallery))
## JetBrains Rider
diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs
index d38cd3a0fd..e9eca97e13 100644
--- a/src/Avalonia.Controls/ComboBox.cs
+++ b/src/Avalonia.Controls/ComboBox.cs
@@ -360,12 +360,12 @@ namespace Avalonia.Controls
var selectedIndex = SelectedIndex;
if (IsDropDownOpen && selectedIndex != -1)
{
- var container = ItemContainerGenerator!.ContainerFromIndex(selectedIndex);
+ var container = ItemContainerGenerator.ContainerFromIndex(selectedIndex);
if (container == null && SelectedIndex != -1)
{
ScrollIntoView(Selection.SelectedIndex);
- container = ItemContainerGenerator!.ContainerFromIndex(selectedIndex);
+ container = ItemContainerGenerator.ContainerFromIndex(selectedIndex);
}
if (container != null && CanFocus(container))
@@ -415,7 +415,7 @@ namespace Avalonia.Controls
private void SelectFocusedItem()
{
- foreach (ItemContainerInfo dropdownItem in ItemContainerGenerator!.Containers)
+ foreach (ItemContainerInfo dropdownItem in ItemContainerGenerator.Containers)
{
if (dropdownItem.ContainerControl.IsFocused)
{
diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs
index 70f771ca00..10e12a1ae0 100644
--- a/src/Avalonia.Controls/ItemsControl.cs
+++ b/src/Avalonia.Controls/ItemsControl.cs
@@ -79,7 +79,7 @@ namespace Avalonia.Controls
///
/// Gets the for the control.
///
- public IItemContainerGenerator? ItemContainerGenerator
+ public IItemContainerGenerator ItemContainerGenerator
{
get
{
@@ -87,13 +87,10 @@ namespace Avalonia.Controls
{
_itemContainerGenerator = CreateItemContainerGenerator();
- if (_itemContainerGenerator != null)
- {
- _itemContainerGenerator.ItemTemplate = ItemTemplate;
- _itemContainerGenerator.Materialized += (_, e) => OnContainersMaterialized(e);
- _itemContainerGenerator.Dematerialized += (_, e) => OnContainersDematerialized(e);
- _itemContainerGenerator.Recycled += (_, e) => OnContainersRecycled(e);
- }
+ _itemContainerGenerator.ItemTemplate = ItemTemplate;
+ _itemContainerGenerator.Materialized += (_, e) => OnContainersMaterialized(e);
+ _itemContainerGenerator.Dematerialized += (_, e) => OnContainersDematerialized(e);
+ _itemContainerGenerator.Recycled += (_, e) => OnContainersRecycled(e);
}
return _itemContainerGenerator;
@@ -240,14 +237,8 @@ namespace Avalonia.Controls
/// Creates the for the control.
///
///
- /// An or null.
+ /// An .
///
- ///
- /// Certain controls such as don't actually create item
- /// containers; however they want it to be ItemsControls so that they have an Items
- /// property etc. In this case, a derived class can override this method to return null
- /// in order to disable the creation of item containers.
- ///
protected virtual IItemContainerGenerator CreateItemContainerGenerator()
{
return new ItemContainerGenerator(this);
diff --git a/src/Avalonia.Controls/MenuBase.cs b/src/Avalonia.Controls/MenuBase.cs
index c36fbcc51f..bdcff5cd09 100644
--- a/src/Avalonia.Controls/MenuBase.cs
+++ b/src/Avalonia.Controls/MenuBase.cs
@@ -81,13 +81,13 @@ namespace Avalonia.Controls
{
var index = SelectedIndex;
return (index != -1) ?
- (IMenuItem?)ItemContainerGenerator!.ContainerFromIndex(index) :
+ (IMenuItem?)ItemContainerGenerator.ContainerFromIndex(index) :
null;
}
set
{
SelectedIndex = value is not null ?
- ItemContainerGenerator!.IndexFromContainer(value) : -1;
+ ItemContainerGenerator.IndexFromContainer(value) : -1;
}
}
@@ -96,7 +96,7 @@ namespace Avalonia.Controls
{
get
{
- return ItemContainerGenerator!.Containers
+ return ItemContainerGenerator.Containers
.Select(x => x.ContainerControl)
.OfType();
}
diff --git a/src/Avalonia.Controls/MenuItem.cs b/src/Avalonia.Controls/MenuItem.cs
index 9540ab05f9..185b834052 100644
--- a/src/Avalonia.Controls/MenuItem.cs
+++ b/src/Avalonia.Controls/MenuItem.cs
@@ -308,12 +308,12 @@ namespace Avalonia.Controls
{
var index = SelectedIndex;
return (index != -1) ?
- (IMenuItem?)ItemContainerGenerator!.ContainerFromIndex(index) :
+ (IMenuItem?)ItemContainerGenerator.ContainerFromIndex(index) :
null;
}
set
{
- SelectedIndex = value is not null ? ItemContainerGenerator!.IndexFromContainer(value) : -1;
+ SelectedIndex = value is not null ? ItemContainerGenerator.IndexFromContainer(value) : -1;
}
}
@@ -322,7 +322,7 @@ namespace Avalonia.Controls
{
get
{
- return ItemContainerGenerator!.Containers
+ return ItemContainerGenerator.Containers
.Select(x => x.ContainerControl)
.OfType();
}
diff --git a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs
index 8883c9e8ce..3d1e7eb5a8 100644
--- a/src/Avalonia.Controls/Presenters/CarouselPresenter.cs
+++ b/src/Avalonia.Controls/Presenters/CarouselPresenter.cs
@@ -170,7 +170,7 @@ namespace Avalonia.Controls.Presenters
{
if (fromIndex != toIndex)
{
- var generator = ItemContainerGenerator!;
+ var generator = ItemContainerGenerator;
IControl? from = null;
IControl? to = null;
diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
index 31de6f6398..840a5ac1dc 100644
--- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
+++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
@@ -908,7 +908,7 @@ namespace Avalonia.Controls.Primitives
{
MarkContainerSelected(
container,
- Selection.IsSelected(ItemContainerGenerator!.IndexFromContainer(container)));
+ Selection.IsSelected(ItemContainerGenerator.IndexFromContainer(container)));
}
}
}
diff --git a/src/Avalonia.Controls/TabControl.cs b/src/Avalonia.Controls/TabControl.cs
index 019bdfb98a..e0ec23b31f 100644
--- a/src/Avalonia.Controls/TabControl.cs
+++ b/src/Avalonia.Controls/TabControl.cs
@@ -164,7 +164,7 @@ namespace Avalonia.Controls
else
{
var container = SelectedItem as IContentControl ??
- ItemContainerGenerator!.ContainerFromIndex(SelectedIndex) as IContentControl;
+ ItemContainerGenerator.ContainerFromIndex(SelectedIndex) as IContentControl;
SelectedContentTemplate = container?.ContentTemplate;
SelectedContent = container?.Content;
}
diff --git a/src/Avalonia.Controls/TreeView.cs b/src/Avalonia.Controls/TreeView.cs
index 9e0a31ad64..9a276e74d2 100644
--- a/src/Avalonia.Controls/TreeView.cs
+++ b/src/Avalonia.Controls/TreeView.cs
@@ -79,7 +79,7 @@ namespace Avalonia.Controls
/// Gets the for the tree view.
///
public new ITreeItemContainerGenerator ItemContainerGenerator =>
- (ITreeItemContainerGenerator)base.ItemContainerGenerator!;
+ (ITreeItemContainerGenerator)base.ItemContainerGenerator;
///
/// Gets or sets a value indicating whether to automatically scroll to newly selected items.
diff --git a/src/Avalonia.Controls/TreeViewItem.cs b/src/Avalonia.Controls/TreeViewItem.cs
index 79e8a199f9..20c0ed386d 100644
--- a/src/Avalonia.Controls/TreeViewItem.cs
+++ b/src/Avalonia.Controls/TreeViewItem.cs
@@ -89,7 +89,7 @@ namespace Avalonia.Controls
/// Gets the for the tree view.
///
public new ITreeItemContainerGenerator ItemContainerGenerator =>
- (ITreeItemContainerGenerator)base.ItemContainerGenerator!;
+ (ITreeItemContainerGenerator)base.ItemContainerGenerator;
///
protected override IItemContainerGenerator CreateItemContainerGenerator() => CreateTreeItemContainerGenerator();
diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs
index a45ccdbc3c..20daaadec0 100644
--- a/src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs
+++ b/src/Avalonia.Visuals/Media/TextFormatting/TextLayout.cs
@@ -35,10 +35,10 @@ namespace Avalonia.Media.TextFormatting
/// The maximum number of text lines.
/// The text style overrides.
public TextLayout(
- string text,
+ string? text,
Typeface typeface,
double fontSize,
- IBrush foreground,
+ IBrush? foreground,
TextAlignment textAlignment = TextAlignment.Left,
TextWrapping textWrapping = TextWrapping.NoWrap,
TextTrimming textTrimming = TextTrimming.None,
@@ -487,7 +487,7 @@ namespace Avalonia.Media.TextFormatting
/// The height of each line of text.
///
private static TextParagraphProperties CreateTextParagraphProperties(Typeface typeface, double fontSize,
- IBrush foreground, TextAlignment textAlignment, TextWrapping textWrapping,
+ IBrush? foreground, TextAlignment textAlignment, TextWrapping textWrapping,
TextDecorationCollection? textDecorations, FlowDirection flowDirection, double lineHeight)
{
var textRunStyle = new GenericTextRunProperties(typeface, fontSize, textDecorations, foreground);