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 -![image](https://user-images.githubusercontent.com/4672627/84707589-5b69a880-af35-11ea-87a6-7ad57a31d314.png) + +([Lunacy](https://icons8.com/lunacy)) -([Synfonia](https://github.com/jmacato/Synfonia)) +![image](https://user-images.githubusercontent.com/4672627/152325740-261c27a3-e6f0-4662-bff7-4796d4940e04.png) +([PlasticSCM](https://www.plasticscm.com/)) -![image](https://user-images.githubusercontent.com/4672627/85069644-d8419000-b18a-11ea-8732-be9055bb61fd.PNG) -([Xaml Control Gallery](https://github.com/AvaloniaUI/xamlcontrolsgallery)) +![image](https://user-images.githubusercontent.com/4672627/152326453-14944c4d-33da-4d50-a268-b87f80927adb.png) +([WasabiWallet](https://www.wasabiwallet.io/)) -![image](https://user-images.githubusercontent.com/4672627/85069659-dc6dad80-b18a-11ea-8375-39ef95315b5c.PNG) -([Xaml Control Gallery](https://github.com/AvaloniaUI/xamlcontrolsgallery)) - -![image](https://user-images.githubusercontent.com/4672627/84708947-c3b98980-af37-11ea-8c9d-503334615bbf.png) -([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);