Browse Source

fix some null annotation in ControlCatalog

Giuseppe Lippolis 3 years ago
parent
commit
2bf853aca9
39 changed files with 190 additions and 169 deletions
  1. 7 3
      samples/ControlCatalog/Converter/MathSubtractConverter.cs
  2. 5 5
      samples/ControlCatalog/DecoratedWindow.xaml.cs
  3. 8 8
      samples/ControlCatalog/MainView.xaml.cs
  4. 3 3
      samples/ControlCatalog/MainWindow.xaml.cs
  5. 2 2
      samples/ControlCatalog/Models/Countries.cs
  6. 2 2
      samples/ControlCatalog/Models/GDPValueConverter.cs
  7. 8 8
      samples/ControlCatalog/Models/Person.cs
  8. 19 14
      samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
  9. 1 1
      samples/ControlCatalog/Pages/ButtonSpinnerPage.xaml.cs
  10. 2 2
      samples/ControlCatalog/Pages/ButtonsPage.xaml.cs
  11. 6 6
      samples/ControlCatalog/Pages/CalendarDatePickerPage.xaml.cs
  12. 2 2
      samples/ControlCatalog/Pages/CalendarPage.xaml.cs
  13. 6 5
      samples/ControlCatalog/Pages/CarouselPage.xaml.cs
  14. 11 11
      samples/ControlCatalog/Pages/ContextFlyoutPage.xaml.cs
  15. 3 3
      samples/ControlCatalog/Pages/ContextMenuPage.xaml.cs
  16. 4 4
      samples/ControlCatalog/Pages/DataGridPage.xaml.cs
  17. 2 2
      samples/ControlCatalog/Pages/DateTimePickerPage.xaml.cs
  18. 16 16
      samples/ControlCatalog/Pages/DialogsPage.xaml.cs
  19. 3 3
      samples/ControlCatalog/Pages/DragAndDropPage.xaml.cs
  20. 4 4
      samples/ControlCatalog/Pages/FlyoutsPage.axaml.cs
  21. 8 5
      samples/ControlCatalog/Pages/ImagePage.xaml.cs
  22. 15 11
      samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml.cs
  23. 1 1
      samples/ControlCatalog/Pages/LabelsPage.axaml.cs
  24. 1 1
      samples/ControlCatalog/Pages/MenuPage.xaml.cs
  25. 2 0
      samples/ControlCatalog/Pages/NativeEmbedPage.xaml.cs
  26. 5 5
      samples/ControlCatalog/Pages/NumericUpDownPage.xaml.cs
  27. 1 1
      samples/ControlCatalog/Pages/ScreenPage.cs
  28. 6 6
      samples/ControlCatalog/Pages/TabControlPage.xaml.cs
  29. 1 1
      samples/ControlCatalog/Pages/TabStripPage.xaml.cs
  30. 1 1
      samples/ControlCatalog/ViewModels/ApplicationViewModel.cs
  31. 1 1
      samples/ControlCatalog/ViewModels/ContextPageViewModel.cs
  32. 1 1
      samples/ControlCatalog/ViewModels/CursorPageViewModel.cs
  33. 10 9
      samples/ControlCatalog/ViewModels/ItemsRepeaterPageViewModel.cs
  34. 7 6
      samples/ControlCatalog/ViewModels/MainWindowViewModel.cs
  35. 4 4
      samples/ControlCatalog/ViewModels/MenuItemViewModel.cs
  36. 1 1
      samples/ControlCatalog/ViewModels/MenuPageViewModel.cs
  37. 2 2
      samples/ControlCatalog/ViewModels/NotificationViewModel.cs
  38. 7 7
      samples/ControlCatalog/ViewModels/TransitioningContentControlPageViewModel.cs
  39. 2 2
      samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs

+ 7 - 3
samples/ControlCatalog/Converter/MathSubtractConverter.cs

@@ -6,12 +6,16 @@ namespace ControlCatalog.Converter;
 
 public class MathSubtractConverter : IValueConverter
 {
-    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+    public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
     {
-        return (double)value - (double)parameter;
+        if (value is double dv && parameter is double dp)
+        {
+            return dv - dp;
+        }
+        return double.NaN;
     }
 
-    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+    public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
     {
         throw new NotSupportedException();
     }

+ 5 - 5
samples/ControlCatalog/DecoratedWindow.xaml.cs

@@ -15,7 +15,7 @@ namespace ControlCatalog
 
         void SetupSide(string name, StandardCursorType cursor, WindowEdge edge)
         {
-            var ctl = this.FindControl<Control>(name);
+            var ctl = this.Get<Control>(name);
             ctl.Cursor = new Cursor(cursor);
             ctl.PointerPressed += (i, e) =>
             {
@@ -26,7 +26,7 @@ namespace ControlCatalog
         private void InitializeComponent()
         {
             AvaloniaXamlLoader.Load(this);
-            this.FindControl<Control>("TitleBar").PointerPressed += (i, e) =>
+            this.Get<Control>("TitleBar").PointerPressed += (i, e) =>
             {
                 PlatformImpl?.BeginMoveDrag(e);
             };
@@ -38,12 +38,12 @@ namespace ControlCatalog
             SetupSide("TopRight", StandardCursorType.TopRightCorner, WindowEdge.NorthEast);
             SetupSide("BottomLeft", StandardCursorType.BottomLeftCorner, WindowEdge.SouthWest);
             SetupSide("BottomRight", StandardCursorType.BottomRightCorner, WindowEdge.SouthEast);
-            this.FindControl<Button>("MinimizeButton").Click += delegate { this.WindowState = WindowState.Minimized; };
-            this.FindControl<Button>("MaximizeButton").Click += delegate
+            this.Get<Button>("MinimizeButton").Click += delegate { this.WindowState = WindowState.Minimized; };
+            this.Get<Button>("MaximizeButton").Click += delegate
             {
                 WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
             };
-            this.FindControl<Button>("CloseButton").Click += delegate
+            this.Get<Button>("CloseButton").Click += delegate
             {
                 Close();
             };

+ 8 - 8
samples/ControlCatalog/MainView.xaml.cs

@@ -18,9 +18,9 @@ namespace ControlCatalog
         {
             AvaloniaXamlLoader.Load(this);
 
-            var sideBar = this.FindControl<TabControl>("Sidebar");
+            var sideBar = this.Get<TabControl>("Sidebar");
 
-            if (AvaloniaLocator.Current.GetService<IRuntimePlatform>().GetRuntimeInfo().IsDesktop)
+            if (AvaloniaLocator.Current?.GetService<IRuntimePlatform>()?.GetRuntimeInfo().IsDesktop == true)
             {
                 IList tabItems = ((IList)sideBar.Items);
                 tabItems.Add(new TabItem()
@@ -36,7 +36,7 @@ namespace ControlCatalog
 
             }
 
-            var themes = this.Find<ComboBox>("Themes");
+            var themes = this.Get<ComboBox>("Themes");
             themes.SelectionChanged += (sender, e) =>
             {
                 if (themes.SelectedItem is CatalogTheme theme)
@@ -80,7 +80,7 @@ namespace ControlCatalog
                 }
             };
 
-            var flowDirections = this.Find<ComboBox>("FlowDirection");
+            var flowDirections = this.Get<ComboBox>("FlowDirection");
             flowDirections.SelectionChanged += (sender, e) =>
             {
                 if (flowDirections.SelectedItem is FlowDirection flowDirection)
@@ -89,7 +89,7 @@ namespace ControlCatalog
                 }
             };
 
-            var decorations = this.Find<ComboBox>("Decorations");
+            var decorations = this.Get<ComboBox>("Decorations");
             decorations.SelectionChanged += (sender, e) =>
             {
                 if (VisualRoot is Window window
@@ -99,8 +99,8 @@ namespace ControlCatalog
                 }
             };
 
-            var transparencyLevels = this.Find<ComboBox>("TransparencyLevels");
-            IDisposable backgroundSetter = null, paneBackgroundSetter = null;
+            var transparencyLevels = this.Get<ComboBox>("TransparencyLevels");
+            IDisposable? backgroundSetter = null, paneBackgroundSetter = null;
             transparencyLevels.SelectionChanged += (sender, e) =>
             {
                 backgroundSetter?.Dispose();
@@ -118,7 +118,7 @@ namespace ControlCatalog
         protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
         {
             base.OnAttachedToVisualTree(e);
-            var decorations = this.Find<ComboBox>("Decorations");
+            var decorations = this.Get<ComboBox>("Decorations");
             if (VisualRoot is Window window)
                 decorations.SelectedIndex = (int)window.SystemDecorations;
         }

+ 3 - 3
samples/ControlCatalog/MainWindow.xaml.cs

@@ -12,7 +12,7 @@ namespace ControlCatalog
     public class MainWindow : Window
     {
         private WindowNotificationManager _notificationArea;
-        private NativeMenu _recentMenu;
+        private NativeMenu? _recentMenu;
 
         public MainWindow()
         {
@@ -28,7 +28,7 @@ namespace ControlCatalog
             };
 
             DataContext = new MainWindowViewModel(_notificationArea);
-            _recentMenu = ((NativeMenu.GetMenu(this).Items[0] as NativeMenuItem).Menu.Items[2] as NativeMenuItem).Menu;
+            _recentMenu = ((NativeMenu.GetMenu(this)?.Items[0] as NativeMenuItem)?.Menu?.Items[2] as NativeMenuItem)?.Menu;
         }
 
         public static string MenuQuitHeader => RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "Quit Avalonia" : "E_xit";
@@ -39,7 +39,7 @@ namespace ControlCatalog
 
         public void OnOpenClicked(object sender, EventArgs args)
         {
-            _recentMenu.Items.Insert(0, new NativeMenuItem("Item " + (_recentMenu.Items.Count + 1)));
+            _recentMenu?.Items.Insert(0, new NativeMenuItem("Item " + (_recentMenu.Items.Count + 1)));
         }
 
         public void OnCloseClicked(object sender, EventArgs args)

+ 2 - 2
samples/ControlCatalog/Models/Countries.cs

@@ -237,7 +237,7 @@ namespace ControlCatalog.Models
             yield return new Country("Zimbabwe", "SUB-SAHARAN AFRICA", 12236805, 390580, 31.3, 0, 0, 67.69, 1900, 90.7, 26.8, 28.01, 21.84);
         }
 
-        static IReadOnlyList<Country> _all;
+        static IReadOnlyList<Country>? _all;
 
         public static IReadOnlyList<Country> All
         {
@@ -253,4 +253,4 @@ namespace ControlCatalog.Models
 
         }
     }
-}
+}

+ 2 - 2
samples/ControlCatalog/Models/GDPValueConverter.cs

@@ -14,7 +14,7 @@ namespace ControlCatalog.Models
 {
     public class GDPValueConverter : IValueConverter
     {
-        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+        public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
         {
             if (value is int gdp)
             {
@@ -29,7 +29,7 @@ namespace ControlCatalog.Models
             return value;
         }
 
-        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+        public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
         {
             throw new NotImplementedException();
         }

+ 8 - 8
samples/ControlCatalog/Models/Person.cs

@@ -13,8 +13,8 @@ namespace ControlCatalog.Models
 {
     public class Person : INotifyDataErrorInfo, INotifyPropertyChanged
     {
-        string _firstName;
-        string _lastName;
+        string _firstName = string.Empty;
+        string _lastName = string.Empty;
         bool _isBanned;
         private int _age;
 
@@ -76,7 +76,7 @@ namespace ControlCatalog.Models
 
         Dictionary<string, List<string>> _errorLookup = new Dictionary<string, List<string>>();
 
-        void SetError(string propertyName, string error)
+        void SetError(string propertyName, string? error)
         {
             if (string.IsNullOrEmpty(error))
             {
@@ -88,11 +88,11 @@ namespace ControlCatalog.Models
                 if (_errorLookup.TryGetValue(propertyName, out List<string> errorList))
                 {
                     errorList.Clear();
-                    errorList.Add(error);
+                    errorList.Add(error!);
                 }
                 else
                 {
-                    var errors = new List<string> { error };
+                    var errors = new List<string> { error! };
                     _errorLookup.Add(propertyName, errors);
                 }
 
@@ -102,8 +102,8 @@ namespace ControlCatalog.Models
 
         public bool HasErrors => _errorLookup.Count > 0;
 
-        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
-        public event PropertyChangedEventHandler PropertyChanged;
+        public event EventHandler<DataErrorsChangedEventArgs>? ErrorsChanged;
+        public event PropertyChangedEventHandler? PropertyChanged;
 
         void OnErrorsChanged(string propertyName)
         {
@@ -114,7 +114,7 @@ namespace ControlCatalog.Models
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
         }
 
-        public IEnumerable GetErrors(string propertyName)
+        public IEnumerable? GetErrors(string propertyName)
         {
             if (_errorLookup.TryGetValue(propertyName, out List<string> errorList))
                 return errorList;

+ 19 - 14
samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs

@@ -126,13 +126,13 @@ namespace ControlCatalog.Pages
             binding.Bindings.Add(new Binding("Name"));
             binding.Bindings.Add(new Binding("Abbreviation"));
 
-            var multibindingBox = this.FindControl<AutoCompleteBox>("MultiBindingBox");
+            var multibindingBox = this.Get<AutoCompleteBox>("MultiBindingBox");
             multibindingBox.ValueMemberBinding = binding;
 
-            var asyncBox = this.FindControl<AutoCompleteBox>("AsyncBox");
+            var asyncBox = this.Get<AutoCompleteBox>("AsyncBox");
             asyncBox.AsyncPopulator = PopulateAsync;
 
-            var customAutocompleteBox = this.FindControl<AutoCompleteBox>("CustomAutocompleteBox");
+            var customAutocompleteBox = this.Get<AutoCompleteBox>("CustomAutocompleteBox");
             customAutocompleteBox.Items = Sentences.SelectMany(x => x);
             customAutocompleteBox.TextFilter = LastWordContains;
             customAutocompleteBox.TextSelector = AppendWord;
@@ -144,11 +144,12 @@ namespace ControlCatalog.Pages
                     .OfType<AutoCompleteBox>();
         }
 
-        private bool StringContains(string str, string query)
+        private bool StringContains(string str, string? query)
         {
+            if (query == null) return false;
             return str.IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0;
         }
-        private async Task<IEnumerable<object>> PopulateAsync(string searchText, CancellationToken cancellationToken)
+        private async Task<IEnumerable<object>> PopulateAsync(string? searchText, CancellationToken cancellationToken)
         {
             await Task.Delay(TimeSpan.FromSeconds(1.5), cancellationToken);
 
@@ -157,14 +158,14 @@ namespace ControlCatalog.Pages
                       .ToList();
         }
 
-        private bool LastWordContains(string searchText, string item)
+        private bool LastWordContains(string? searchText, string? item)
         {
-            var words = searchText.Split(' ');
+            var words = searchText?.Split(' ') ?? Array.Empty<string>();
             var options = Sentences.Select(x => x.First).ToArray();
             for (var i = 0; i < words.Length; ++i)
             {
                 var word = words[i];
-                for (var j = 0; j < options.Length; ++j)
+                for (var j = 0; word is { } && j < options.Length; ++j)
                 {
                     var option = options[j];
                     if (option == null)
@@ -183,14 +184,18 @@ namespace ControlCatalog.Pages
 
             return options.Any(x => x != null && x.Value == item);
         }
-        private string AppendWord(string text, string item)
+        private string AppendWord(string? text, string? item)
         {
-            string[] parts = text.Split(' ');
-            if (parts.Length == 0)
-                return item;
+            if (item is { })
+            {
+                string[] parts = text?.Split(' ') ?? Array.Empty<string>();
+                if (parts.Length == 0)
+                    return item;
 
-            parts[parts.Length - 1] = item;
-            return string.Join(" ", parts);
+                parts[parts.Length - 1] = item;
+                return string.Join(" ", parts);
+            }
+            return string.Empty;
         }
 
         private void InitializeComponent()

+ 1 - 1
samples/ControlCatalog/Pages/ButtonSpinnerPage.xaml.cs

@@ -23,7 +23,7 @@ namespace ControlCatalog.Pages
             var spinner = (ButtonSpinner)sender;
             var txtBox = (TextBlock)spinner.Content;
 
-            int value = Array.IndexOf(_mountains, txtBox.Text);
+            int value = Array.IndexOf(_mountains, txtBox?.Text);
             if (e.Direction == SpinDirection.Increase)
                 value++;
             else

+ 2 - 2
samples/ControlCatalog/Pages/ButtonsPage.xaml.cs

@@ -11,7 +11,7 @@ namespace ControlCatalog.Pages
         {
             InitializeComponent();
 
-            this.FindControl<RepeatButton>("RepeatButton").Click += OnRepeatButtonClick;
+            this.Get<RepeatButton>("RepeatButton").Click += OnRepeatButtonClick;
         }
 
         private void InitializeComponent()
@@ -22,7 +22,7 @@ namespace ControlCatalog.Pages
         public void OnRepeatButtonClick(object sender, object args)
         {
             repeatButtonClickCount++;
-            var textBlock = this.FindControl<TextBlock>("RepeatButtonTextBlock");
+            var textBlock = this.Get<TextBlock>("RepeatButtonTextBlock");
             textBlock.Text = $"Repeat Button: {repeatButtonClickCount}";
         }
     }

+ 6 - 6
samples/ControlCatalog/Pages/CalendarDatePickerPage.xaml.cs

@@ -10,11 +10,11 @@ namespace ControlCatalog.Pages
         {
             InitializeComponent();
             
-            var dp1 = this.FindControl<CalendarDatePicker>("DatePicker1");
-            var dp2 = this.FindControl<CalendarDatePicker>("DatePicker2");
-            var dp3 = this.FindControl<CalendarDatePicker>("DatePicker3");
-            var dp4 = this.FindControl<CalendarDatePicker>("DatePicker4");
-            var dp5 = this.FindControl<CalendarDatePicker>("DatePicker5");
+            var dp1 = this.Get<CalendarDatePicker>("DatePicker1");
+            var dp2 = this.Get<CalendarDatePicker>("DatePicker2");
+            var dp3 = this.Get<CalendarDatePicker>("DatePicker3");
+            var dp4 = this.Get<CalendarDatePicker>("DatePicker4");
+            var dp5 = this.Get<CalendarDatePicker>("DatePicker5");
 
             dp1.SelectedDate = DateTime.Today;
             dp2.SelectedDate = DateTime.Today.AddDays(10);
@@ -23,7 +23,7 @@ namespace ControlCatalog.Pages
 
             dp4.TemplateApplied += (s, e) =>
             {
-                dp4.BlackoutDates.AddDatesInPast();
+                dp4.BlackoutDates?.AddDatesInPast();
             };
             
         }

+ 2 - 2
samples/ControlCatalog/Pages/CalendarPage.xaml.cs

@@ -11,11 +11,11 @@ namespace ControlCatalog.Pages
             this.InitializeComponent();
 
             var today = DateTime.Today; 
-            var cal1 = this.FindControl<Calendar>("DisplayDatesCalendar");
+            var cal1 = this.Get<Calendar>("DisplayDatesCalendar");
             cal1.DisplayDateStart = today.AddDays(-25);
             cal1.DisplayDateEnd = today.AddDays(25);
 
-            var cal2 = this.FindControl<Calendar>("BlackoutDatesCalendar");
+            var cal2 = this.Get<Calendar>("BlackoutDatesCalendar");
             cal2.BlackoutDates.AddDatesInPast();
             cal2.BlackoutDates.Add(new CalendarDateRange(today.AddDays(6)));
         }

+ 6 - 5
samples/ControlCatalog/Pages/CarouselPage.xaml.cs

@@ -16,6 +16,11 @@ namespace ControlCatalog.Pages
         public CarouselPage()
         {
             this.InitializeComponent();
+            _carousel = this.Get<Carousel>("carousel");
+            _left = this.Get<Button>("left");
+            _right = this.Get<Button>("right");
+            _transition = this.Get<ComboBox>("transition");
+            _orientation = this.Get<ComboBox>("orientation");
             _left.Click += (s, e) => _carousel.Previous();
             _right.Click += (s, e) => _carousel.Next();
             _transition.SelectionChanged += TransitionChanged;
@@ -25,11 +30,7 @@ namespace ControlCatalog.Pages
         private void InitializeComponent()
         {
             AvaloniaXamlLoader.Load(this);
-            _carousel = this.FindControl<Carousel>("carousel");
-            _left = this.FindControl<Button>("left");
-            _right = this.FindControl<Button>("right");
-            _transition = this.FindControl<ComboBox>("transition");
-            _orientation = this.FindControl<ComboBox>("orientation");
+
         }
 
         private void TransitionChanged(object sender, SelectionChangedEventArgs e)

+ 11 - 11
samples/ControlCatalog/Pages/ContextFlyoutPage.xaml.cs

@@ -18,29 +18,29 @@ namespace ControlCatalog.Pages
 
             DataContext = new ContextPageViewModel();
 
-            _textBox = this.FindControl<TextBox>("TextBox");
+            _textBox = this.Get<TextBox>("TextBox");
 
-            var cutButton = this.FindControl<Button>("CutButton");
+            var cutButton = this.Get<Button>("CutButton");
             cutButton.Click += CloseFlyout;
 
-            var copyButton = this.FindControl<Button>("CopyButton");
+            var copyButton = this.Get<Button>("CopyButton");
             copyButton.Click += CloseFlyout;
 
-            var pasteButton = this.FindControl<Button>("PasteButton");
+            var pasteButton = this.Get<Button>("PasteButton");
             pasteButton.Click += CloseFlyout;
 
-            var clearButton = this.FindControl<Button>("ClearButton");
+            var clearButton = this.Get<Button>("ClearButton");
             clearButton.Click += CloseFlyout;
 
-            var customContextRequestedBorder = this.FindControl<Border>("CustomContextRequestedBorder");
+            var customContextRequestedBorder = this.Get<Border>("CustomContextRequestedBorder");
             customContextRequestedBorder.AddHandler(ContextRequestedEvent, CustomContextRequested, RoutingStrategies.Tunnel);
 
-            var cancellableContextBorder = this.FindControl<Border>("CancellableContextBorder");
+            var cancellableContextBorder = this.Get<Border>("CancellableContextBorder");
             cancellableContextBorder.ContextFlyout!.Closing += ContextFlyoutPage_Closing;
             cancellableContextBorder.ContextFlyout!.Opening += ContextFlyoutPage_Opening;
         }
 
-        private ContextPageViewModel _model;
+        private ContextPageViewModel? _model;
         protected override void OnDataContextChanged(EventArgs e)
         {
             if (_model != null)
@@ -55,7 +55,7 @@ namespace ControlCatalog.Pages
         private void ContextFlyoutPage_Closing(object sender, CancelEventArgs e)
         {
             var cancelCloseCheckBox = this.FindControl<CheckBox>("CancelCloseCheckBox");
-            e.Cancel = cancelCloseCheckBox.IsChecked ?? false;
+            e.Cancel = cancelCloseCheckBox?.IsChecked ?? false;
         }
 
         private void ContextFlyoutPage_Opening(object sender, EventArgs e)
@@ -63,13 +63,13 @@ namespace ControlCatalog.Pages
             if (e is CancelEventArgs cancelArgs)
             {
                 var cancelCloseCheckBox = this.FindControl<CheckBox>("CancelOpenCheckBox");
-                cancelArgs.Cancel = cancelCloseCheckBox.IsChecked ?? false;
+                cancelArgs.Cancel = cancelCloseCheckBox?.IsChecked ?? false;
             }
         }
 
         private void CloseFlyout(object sender, RoutedEventArgs e)
         {
-            _textBox.ContextFlyout.Hide();
+            _textBox.ContextFlyout?.Hide();
         }
 
         public void CustomContextRequested(object sender, ContextRequestedEventArgs e)

+ 3 - 3
samples/ControlCatalog/Pages/ContextMenuPage.xaml.cs

@@ -15,15 +15,15 @@ namespace ControlCatalog.Pages
             this.InitializeComponent();
             DataContext = new ContextPageViewModel();
 
-            var customContextRequestedBorder = this.FindControl<Border>("CustomContextRequestedBorder");
+            var customContextRequestedBorder = this.Get<Border>("CustomContextRequestedBorder");
             customContextRequestedBorder.AddHandler(ContextRequestedEvent, CustomContextRequested, RoutingStrategies.Tunnel);
 
-            var cancellableContextBorder = this.FindControl<Border>("CancellableContextBorder");
+            var cancellableContextBorder = this.Get<Border>("CancellableContextBorder");
             cancellableContextBorder.ContextMenu!.ContextMenuClosing += ContextFlyoutPage_Closing;
             cancellableContextBorder.ContextMenu!.ContextMenuOpening += ContextFlyoutPage_Opening;
         }
 
-        private ContextPageViewModel _model;
+        private ContextPageViewModel? _model;
         protected override void OnDataContextChanged(EventArgs e)
         {
             if (_model != null)

+ 4 - 4
samples/ControlCatalog/Pages/DataGridPage.xaml.cs

@@ -21,7 +21,7 @@ namespace ControlCatalog.Pages
             var dataGridSortDescription = DataGridSortDescription.FromPath(nameof(Country.Region), ListSortDirection.Ascending, new ReversedStringComparer());
             var collectionView1 = new DataGridCollectionView(Countries.All);
             collectionView1.SortDescriptions.Add(dataGridSortDescription);
-            var dg1 = this.FindControl<DataGrid>("dataGrid1");
+            var dg1 = this.Get<DataGrid>("dataGrid1");
             dg1.IsReadOnly = true;
             dg1.LoadingRow += Dg1_LoadingRow;
             dg1.Sorting += (s, a) =>
@@ -37,7 +37,7 @@ namespace ControlCatalog.Pages
             };
             dg1.Items = collectionView1;
 
-            var dg2 = this.FindControl<DataGrid>("dataGridGrouping");
+            var dg2 = this.Get<DataGrid>("dataGridGrouping");
             dg2.IsReadOnly = true;
 
             var collectionView2 = new DataGridCollectionView(Countries.All);
@@ -45,7 +45,7 @@ namespace ControlCatalog.Pages
 
             dg2.Items = collectionView2;
 
-            var dg3 = this.FindControl<DataGrid>("dataGridEdit");
+            var dg3 = this.Get<DataGrid>("dataGridEdit");
             dg3.IsReadOnly = false;
 
             var items = new List<Person>
@@ -58,7 +58,7 @@ namespace ControlCatalog.Pages
 
             dg3.Items = collectionView3;
 
-            var addButton = this.FindControl<Button>("btnAdd");
+            var addButton = this.Get<Button>("btnAdd");
             addButton.Click += (a, b) => collectionView3.AddNew();
         }
 

+ 2 - 2
samples/ControlCatalog/Pages/DateTimePickerPage.xaml.cs

@@ -9,12 +9,12 @@ namespace ControlCatalog.Pages
         public DateTimePickerPage()
         {
             this.InitializeComponent();
-            this.FindControl<TextBlock>("DatePickerDesc").Text = "Use a DatePicker to let users set a date in your app, " +
+            this.Get<TextBlock>("DatePickerDesc").Text = "Use a DatePicker to let users set a date in your app, " +
                 "for example to schedule an appointment. The DatePicker displays three controls for month, day, and year. " +
                 "These controls are easy to use with touch or mouse, and they can be styled and configured in several different ways. " +
                 "Order of month, day, and year is dynamically set based on user date settings";
 
-            this.FindControl<TextBlock>("TimePickerDesc").Text = "Use a TimePicker to let users set a time in your app, for example " +
+            this.Get<TextBlock>("TimePickerDesc").Text = "Use a TimePicker to let users set a time in your app, for example " +
                 "to set a reminder. The TimePicker displays three controls for hour, minute, and AM / PM(if necessary).These controls " +
                 "are easy to use with touch or mouse, and they can be styled and configured in several different ways. " +
                 "12 - hour or 24 - hour clock and visiblility of AM / PM is dynamically set based on user time settings, or can be overridden.";

+ 16 - 16
samples/ControlCatalog/Pages/DialogsPage.xaml.cs

@@ -16,14 +16,14 @@ namespace ControlCatalog.Pages
         {
             this.InitializeComponent();
 
-            var results = this.FindControl<ItemsPresenter>("PickerLastResults");
-            var resultsVisible = this.FindControl<TextBlock>("PickerLastResultsVisible");
+            var results = this.Get<ItemsPresenter>("PickerLastResults");
+            var resultsVisible = this.Get<TextBlock>("PickerLastResultsVisible");
 
-            string lastSelectedDirectory = null;
+            string? lastSelectedDirectory = null;
 
             List<FileDialogFilter>? GetFilters()
             {
-                if (this.FindControl<CheckBox>("UseFilters").IsChecked != true)
+                if (this.Get<CheckBox>("UseFilters").IsChecked != true)
                     return null;
                 return  new List<FileDialogFilter>
                 {
@@ -39,7 +39,7 @@ namespace ControlCatalog.Pages
                 };
             }
 
-            this.FindControl<Button>("OpenFile").Click += async delegate
+            this.Get<Button>("OpenFile").Click += async delegate
             {
                 // Almost guaranteed to exist
                 var fullPath = Assembly.GetEntryAssembly()?.GetModules().FirstOrDefault()?.FullyQualifiedName;
@@ -56,7 +56,7 @@ namespace ControlCatalog.Pages
                 results.Items = result;
                 resultsVisible.IsVisible = result?.Any() == true;
             };
-            this.FindControl<Button>("OpenMultipleFiles").Click += async delegate
+            this.Get<Button>("OpenMultipleFiles").Click += async delegate
             {
                 var result = await new OpenFileDialog()
                 {
@@ -68,7 +68,7 @@ namespace ControlCatalog.Pages
                 results.Items = result;
                 resultsVisible.IsVisible = result?.Any() == true;
             };
-            this.FindControl<Button>("SaveFile").Click += async delegate
+            this.Get<Button>("SaveFile").Click += async delegate
             {
                 var result = await new SaveFileDialog()
                 {
@@ -80,7 +80,7 @@ namespace ControlCatalog.Pages
                 results.Items = new[] { result };
                 resultsVisible.IsVisible = result != null;
             };
-            this.FindControl<Button>("SelectFolder").Click += async delegate
+            this.Get<Button>("SelectFolder").Click += async delegate
             {
                 var result = await new OpenFolderDialog()
                 {
@@ -96,7 +96,7 @@ namespace ControlCatalog.Pages
                 results.Items = new [] { result };
                 resultsVisible.IsVisible = result != null;
             };
-            this.FindControl<Button>("OpenBoth").Click += async delegate
+            this.Get<Button>("OpenBoth").Click += async delegate
             {
                 var result = await new OpenFileDialog()
                 {
@@ -110,35 +110,35 @@ namespace ControlCatalog.Pages
                 results.Items = result;
                 resultsVisible.IsVisible = result?.Any() == true;
             };
-            this.FindControl<Button>("DecoratedWindow").Click += delegate
+            this.Get<Button>("DecoratedWindow").Click += delegate
             {
                 new DecoratedWindow().Show();
             };
-            this.FindControl<Button>("DecoratedWindowDialog").Click += delegate
+            this.Get<Button>("DecoratedWindowDialog").Click += delegate
             {
                 new DecoratedWindow().ShowDialog(GetWindow());
             };
-            this.FindControl<Button>("Dialog").Click += delegate
+            this.Get<Button>("Dialog").Click += delegate
             {
                 var window = CreateSampleWindow();
                 window.Height = 200;
                 window.ShowDialog(GetWindow());
             };
-            this.FindControl<Button>("DialogNoTaskbar").Click += delegate
+            this.Get<Button>("DialogNoTaskbar").Click += delegate
             {
                 var window = CreateSampleWindow();
                 window.Height = 200;
                 window.ShowInTaskbar = false;
                 window.ShowDialog(GetWindow());
             };
-            this.FindControl<Button>("OwnedWindow").Click += delegate
+            this.Get<Button>("OwnedWindow").Click += delegate
             {
                 var window = CreateSampleWindow();
 
                 window.Show(GetWindow());
             };
 
-            this.FindControl<Button>("OwnedWindowNoTaskbar").Click += delegate
+            this.Get<Button>("OwnedWindowNoTaskbar").Click += delegate
             {
                 var window = CreateSampleWindow();
 
@@ -191,7 +191,7 @@ namespace ControlCatalog.Pages
             return window;
         }
 
-        Window GetWindow() => (Window)this.VisualRoot;
+        Window GetWindow() => this.VisualRoot as Window  ?? throw new NullReferenceException("Invalid Owner");
 
         private void InitializeComponent()
         {

+ 3 - 3
samples/ControlCatalog/Pages/DragAndDropPage.xaml.cs

@@ -14,7 +14,7 @@ namespace ControlCatalog.Pages
         public DragAndDropPage()
         {
             this.InitializeComponent();
-            _DropState = this.Find<TextBlock>("DropState");
+            _DropState = this.Get<TextBlock>("DropState");
 
             int textCount = 0;
             SetupDnd("Text", d => d.Set(DataFormats.Text,
@@ -26,8 +26,8 @@ namespace ControlCatalog.Pages
 
         void SetupDnd(string suffix, Action<DataObject> factory, DragDropEffects effects)
         {
-            var dragMe = this.Find<Border>("DragMe" + suffix);
-            var dragState = this.Find<TextBlock>("DragState"+suffix);
+            var dragMe = this.Get<Border>("DragMe" + suffix);
+            var dragState = this.Get<TextBlock>("DragState"+suffix);
 
             async void DoDrag(object sender, Avalonia.Input.PointerPressedEventArgs e)
             {

+ 4 - 4
samples/ControlCatalog/Pages/FlyoutsPage.axaml.cs

@@ -35,7 +35,7 @@ namespace ControlCatalog.Pages
 
         private void SetXamlTexts()
         {
-            var bfxt = this.FindControl<TextBlock>("ButtonFlyoutXamlText");
+            var bfxt = this.Get<TextBlock>("ButtonFlyoutXamlText");
             bfxt.Text = "<Button Content=\"Click me!\">\n" +
                         "    <Button.Flyout>\n" +
                         "        <Flyout>\n" +
@@ -45,7 +45,7 @@ namespace ControlCatalog.Pages
                         "        </Flyout>\n" +
                         "    </Button.Flyout>\n</Button>";
 
-            var mfxt = this.FindControl<TextBlock>("MenuFlyoutXamlText");
+            var mfxt = this.Get<TextBlock>("MenuFlyoutXamlText");
             mfxt.Text = "<Button Content=\"Click me!\">\n" +
                     "    <Button.Flyout>\n" +
                     "        <MenuFlyout>\n" +
@@ -54,7 +54,7 @@ namespace ControlCatalog.Pages
                     "        </MenuFlyout>\n" +
                     "    </Button.Flyout>\n</Button>";
 
-            var afxt = this.FindControl<TextBlock>("AttachedFlyoutXamlText");
+            var afxt = this.Get<TextBlock>("AttachedFlyoutXamlText");
             afxt.Text = "<Panel Name=\"AttachedFlyoutPanel\">\n" +
                 "    <FlyoutBase.AttachedFlyout>\n" +
                 "        <Flyout>\n" +
@@ -66,7 +66,7 @@ namespace ControlCatalog.Pages
                 "\n\n In DoubleTapped handler:\n" +
                 "FlyoutBase.ShowAttachedFlyout(AttachedFlyoutPanel);";
 
-            var sfxt = this.FindControl<TextBlock>("SharedFlyoutXamlText");
+            var sfxt = this.Get<TextBlock>("SharedFlyoutXamlText");
             sfxt.Text = "Declare a flyout in Resources:\n" +
                 "<Window.Resources>\n" +
                 "    <Flyout x:Key=\"SharedFlyout\">\n" +

+ 8 - 5
samples/ControlCatalog/Pages/ImagePage.xaml.cs

@@ -17,9 +17,9 @@ namespace ControlCatalog.Pages
         public ImagePage()
         {
             InitializeComponent();
-            _bitmapImage = this.FindControl<Image>("bitmapImage");
-            _drawingImage = this.FindControl<Image>("drawingImage");
-            _croppedImage = this.FindControl<Image>("croppedImage");
+            _bitmapImage = this.Get<Image>("bitmapImage");
+            _drawingImage = this.Get<Image>("drawingImage");
+            _croppedImage = this.Get<Image>("croppedImage");
         }
 
         private void InitializeComponent()
@@ -50,8 +50,11 @@ namespace ControlCatalog.Pages
             if (_croppedImage != null)
             {
                 var comboxBox = (ComboBox)sender;
-                var croppedBitmap = _croppedImage.Source as CroppedBitmap;
-                croppedBitmap.SourceRect = GetCropRect(comboxBox.SelectedIndex);
+                if (_croppedImage.Source is CroppedBitmap croppedBitmap)
+                {
+                    croppedBitmap.SourceRect = GetCropRect(comboxBox.SelectedIndex);
+                }
+                
             }
         }
 

+ 15 - 11
samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml.cs

@@ -24,11 +24,11 @@ namespace ControlCatalog.Pages
         public ItemsRepeaterPage()
         {
             this.InitializeComponent();
-            _repeater = this.FindControl<ItemsRepeater>("repeater");
-            _scroller = this.FindControl<ScrollViewer>("scroller");
-            _scrollToLast = this.FindControl<Button>("scrollToLast");
-            _scrollToRandom = this.FindControl<Button>("scrollToRandom");
-            _scrollToSelected = this.FindControl<Button>("scrollToSelected");
+            _repeater = this.Get<ItemsRepeater>("repeater");
+            _scroller = this.Get<ScrollViewer>("scroller");
+            _scrollToLast = this.Get<Button>("scrollToLast");
+            _scrollToRandom = this.Get<Button>("scrollToRandom");
+            _scrollToSelected = this.Get<Button>("scrollToSelected");
             _repeater.PointerPressed += RepeaterClick;
             _repeater.KeyDown += RepeaterOnKeyDown;
             _scrollToLast.Click += scrollToLast_Click;
@@ -44,8 +44,10 @@ namespace ControlCatalog.Pages
 
         public void OnSelectTemplateKey(object sender, SelectTemplateEventArgs e)
         {
-            var item = (ItemsRepeaterPageViewModel.Item)e.DataContext;
-            e.TemplateKey = (item.Index % 2 == 0) ? "even" : "odd";
+            if (e.DataContext is ItemsRepeaterPageViewModel.Item item)
+            {
+                e.TemplateKey = (item.Index % 2 == 0) ? "even" : "odd";
+            }
         }
 
         private void LayoutChanged(object sender, SelectionChangedEventArgs e)
@@ -115,7 +117,7 @@ namespace ControlCatalog.Pages
         private void ScrollTo(int index)
         {
             System.Diagnostics.Debug.WriteLine("Scroll to " + index);
-            var layoutManager = ((TopLevel)VisualRoot).LayoutManager;
+            var layoutManager = ((TopLevel)VisualRoot!).LayoutManager;
             var element = _repeater.GetOrCreateElement(index);
             layoutManager.ExecuteLayoutPass();
             element.BringIntoView();
@@ -123,9 +125,11 @@ namespace ControlCatalog.Pages
 
         private void RepeaterClick(object sender, PointerPressedEventArgs e)
         {
-            var item = (e.Source as TextBlock)?.DataContext as ItemsRepeaterPageViewModel.Item;
-            _viewModel.SelectedItem = item;
-            _selectedIndex = _viewModel.Items.IndexOf(item);
+            if ((e.Source as TextBlock)?.DataContext is ItemsRepeaterPageViewModel.Item item)
+            {
+                _viewModel.SelectedItem = item;
+                _selectedIndex = _viewModel.Items.IndexOf(item);
+            }
         }
 
         private void RepeaterOnKeyDown(object sender, KeyEventArgs e)

+ 1 - 1
samples/ControlCatalog/Pages/LabelsPage.axaml.cs

@@ -7,7 +7,7 @@ namespace ControlCatalog.Pages
 {
     public class LabelsPage : UserControl
     {
-        private Person _person;
+        private Person? _person;
 
         public LabelsPage()
         {

+ 1 - 1
samples/ControlCatalog/Pages/MenuPage.xaml.cs

@@ -22,7 +22,7 @@ namespace ControlCatalog.Pages
             AvaloniaXamlLoader.Load(this);
         }
         
-        private MenuPageViewModel _model;
+        private MenuPageViewModel? _model;
         protected override void OnDataContextChanged(EventArgs e)
         {
             if (_model != null)

+ 2 - 0
samples/ControlCatalog/Pages/NativeEmbedPage.xaml.cs

@@ -79,6 +79,8 @@ namespace ControlCatalog.Pages
     public interface INativeDemoControl
     {
         /// <param name="isSecond">Used to specify which control should be displayed as a demo</param>
+        /// <param name="parent"></param>
+        /// <param name="createDefault"></param>
         IPlatformHandle CreateControl(bool isSecond, IPlatformHandle parent, Func<IPlatformHandle> createDefault);
     }
 }

+ 5 - 5
samples/ControlCatalog/Pages/NumericUpDownPage.xaml.cs

@@ -28,16 +28,16 @@ namespace ControlCatalog.Pages
 
     public class NumbersPageViewModel : ViewModelBase
     {
-        private IList<FormatObject> _formats;
+        private IList<FormatObject>? _formats;
         private FormatObject _selectedFormat;
-        private IList<Location> _spinnerLocations;
+        private IList<Location>? _spinnerLocations;
 
         private double _doubleValue;
         private decimal _decimalValue;
 
         public NumbersPageViewModel()
         {
-            SelectedFormat = Formats.FirstOrDefault();
+            _selectedFormat = Formats.FirstOrDefault();
         }
 
         public double DoubleValue
@@ -103,7 +103,7 @@ namespace ControlCatalog.Pages
 
     public class FormatObject
     {
-        public string Value { get; set; }
-        public string Name { get; set; }
+        public string? Value { get; set; }
+        public string? Name { get; set; }
     }
 }

+ 1 - 1
samples/ControlCatalog/Pages/ScreenPage.cs

@@ -18,7 +18,7 @@ namespace ControlCatalog.Pages
         protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
         {
             base.OnAttachedToVisualTree(e);
-            Window w = (Window)VisualRoot;
+            Window w = (Window)VisualRoot!;
             w.PositionChanged += (sender, args) => InvalidateVisual();
         }
 

+ 6 - 6
samples/ControlCatalog/Pages/TabControlPage.xaml.cs

@@ -52,7 +52,7 @@ namespace ControlCatalog.Pages
 
         private IBitmap LoadBitmap(string uri)
         {
-            var assets = AvaloniaLocator.Current.GetService<IAssetLoader>();
+            var assets = AvaloniaLocator.Current!.GetService<IAssetLoader>()!;
             return new Bitmap(assets.Open(new Uri(uri)));
         }
 
@@ -60,7 +60,7 @@ namespace ControlCatalog.Pages
         {
             private Dock _tabPlacement;
 
-            public TabItemViewModel[] Tabs { get; set; }
+            public TabItemViewModel[]? Tabs { get; set; }
 
             public Dock TabPlacement
             {
@@ -71,10 +71,10 @@ namespace ControlCatalog.Pages
 
         private class TabItemViewModel
         {
-            public string Header { get; set; }
-            public string Text { get; set; }
-            public IBitmap Image { get; set; }
-            public bool IsEnabled { get; set; } = true;           
+            public string? Header { get; set; }
+            public string? Text { get; set; }
+            public IBitmap? Image { get; set; }
+            public bool IsEnabled { get; set; } = true;
         }
     }
 }

+ 1 - 1
samples/ControlCatalog/Pages/TabStripPage.xaml.cs

@@ -38,7 +38,7 @@ namespace ControlCatalog.Pages
 
         private class TabStripItemViewModel
         {
-            public string Header { get; set; }
+            public string? Header { get; set; }
             public bool IsEnabled { get; set; } = true;
         }
     }

+ 1 - 1
samples/ControlCatalog/ViewModels/ApplicationViewModel.cs

@@ -10,7 +10,7 @@ namespace ControlCatalog.ViewModels
         {
             ExitCommand = MiniCommand.Create(() =>
             {
-                if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime)
+                if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime)
                 {
                     lifetime.Shutdown();
                 }

+ 1 - 1
samples/ControlCatalog/ViewModels/ContextPageViewModel.cs

@@ -9,7 +9,7 @@ namespace ControlCatalog.ViewModels
 {
     public class ContextPageViewModel
     {
-        public Control View { get; set; }
+        public Control? View { get; set; }
         public ContextPageViewModel()
         {
             OpenCommand = MiniCommand.CreateFromTask(Open);

+ 1 - 1
samples/ControlCatalog/ViewModels/CursorPageViewModel.cs

@@ -18,7 +18,7 @@ namespace ControlCatalog.ViewModels
                 .Select(x => new StandardCursorModel(x))
                 .ToList();
 
-            var loader = AvaloniaLocator.Current.GetService<IAssetLoader>();
+            var loader = AvaloniaLocator.Current!.GetService<IAssetLoader>()!;
             var s = loader.Open(new Uri("avares://ControlCatalog/Assets/avalonia-32.png"));
             var bitmap = new Bitmap(s);
             CustomCursor = new Cursor(bitmap, new PixelPoint(16, 16));

+ 10 - 9
samples/ControlCatalog/ViewModels/ItemsRepeaterPageViewModel.cs

@@ -14,7 +14,7 @@ namespace ControlCatalog.ViewModels
 
         public ItemsRepeaterPageViewModel()
         {
-            Items = CreateItems();
+            _items = CreateItems();
         }
 
         public ObservableCollection<Item> Items
@@ -23,12 +23,12 @@ namespace ControlCatalog.ViewModels
             set => this.RaiseAndSetIfChanged(ref _items, value);
         }
 
-        public Item SelectedItem { get; set; }
+        public Item? SelectedItem { get; set; }
 
         public void AddItem()
         {
             var index = SelectedItem != null ? Items.IndexOf(SelectedItem) : -1;
-            Items.Insert(index + 1, new Item(index + 1) { Text = $"New Item {_newItemIndex++}" });
+            Items.Insert(index + 1, new Item(index + 1, $"New Item {_newItemIndex++}"));
         }
 
         public void RemoveItem()
@@ -66,19 +66,20 @@ namespace ControlCatalog.ViewModels
             _newGenerationIndex++;
 
             return new ObservableCollection<Item>(
-                Enumerable.Range(1, 100000).Select(i => new Item(i)
-                {
-                    Text = $"Item {i.ToString()} {suffix}"
-                }));
+                Enumerable.Range(1, 100000).Select(i => new Item(i, $"Item {i.ToString()} {suffix}")));
         }
 
         public class Item : ViewModelBase
         {
             private double _height = double.NaN;
 
-            public Item(int index) => Index = index;
+            public Item(int index, string text)
+            {
+                Index = index;
+                Text = text;
+            }
             public int Index { get; }
-            public string Text { get; set; }
+            public string Text { get; }
             
             public double Height 
             {

+ 7 - 6
samples/ControlCatalog/ViewModels/MainWindowViewModel.cs

@@ -16,11 +16,11 @@ namespace ControlCatalog.ViewModels
 
         private bool _isMenuItemChecked = true;
         private WindowState _windowState;
-        private WindowState[] _windowStates;
+        private WindowState[] _windowStates = Array.Empty<WindowState>();
         private int _transparencyLevel;
         private ExtendClientAreaChromeHints _chromeHints = ExtendClientAreaChromeHints.PreferSystemChrome;
         private bool _extendClientAreaEnabled;
-        private bool _systemTitleBarEnabled;        
+        private bool _systemTitleBarEnabled;
         private bool _preferSystemChromeEnabled;
         private double _titleBarHeight;
 
@@ -47,14 +47,15 @@ namespace ControlCatalog.ViewModels
             {
                 var dialog = new AboutAvaloniaDialog();
 
-                var mainWindow = (App.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow;
-
-                await dialog.ShowDialog(mainWindow);
+                if ((App.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow is { } mainWindow)
+                {
+                    await dialog.ShowDialog(mainWindow);
+                }
             });
 
             ExitCommand = MiniCommand.Create(() =>
             {
-                (App.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime).Shutdown();
+                (App.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.Shutdown();
             });
 
             ToggleMenuItemCheckedCommand = MiniCommand.Create(() =>

+ 4 - 4
samples/ControlCatalog/ViewModels/MenuItemViewModel.cs

@@ -5,9 +5,9 @@ namespace ControlCatalog.ViewModels
 {
     public class MenuItemViewModel
     {
-        public string Header { get; set; }
-        public ICommand Command { get; set; }
-        public object CommandParameter { get; set; }
-        public IList<MenuItemViewModel> Items { get; set; }
+        public string? Header { get; set; }
+        public ICommand? Command { get; set; }
+        public object? CommandParameter { get; set; }
+        public IList<MenuItemViewModel>? Items { get; set; }
     }
 }

+ 1 - 1
samples/ControlCatalog/ViewModels/MenuPageViewModel.cs

@@ -10,7 +10,7 @@ namespace ControlCatalog.ViewModels
 {
     public class MenuPageViewModel
     {
-        public Control View { get; set; }
+        public Control? View { get; set; }
         public MenuPageViewModel()
         {
             OpenCommand = MiniCommand.CreateFromTask(Open);

+ 2 - 2
samples/ControlCatalog/ViewModels/NotificationViewModel.cs

@@ -19,8 +19,8 @@ namespace ControlCatalog.ViewModels
             });
         }
 
-        public string Title { get; set; }
-        public string Message { get; set; }
+        public string? Title { get; set; }
+        public string? Message { get; set; }
 
         public MiniCommand YesCommand { get; }
 

+ 7 - 7
samples/ControlCatalog/ViewModels/TransitioningContentControlPageViewModel.cs

@@ -19,7 +19,7 @@ namespace ControlCatalog.ViewModels
     {
         public TransitioningContentControlPageViewModel()
         {
-            var assetLoader = AvaloniaLocator.Current.GetService<IAssetLoader>();
+            var assetLoader = AvaloniaLocator.Current?.GetService<IAssetLoader>()!;
 
             var images = new string[] 
             { 
@@ -36,8 +36,8 @@ namespace ControlCatalog.ViewModels
 
             SetupTransitions();
 
-            SelectedTransition = PageTransitions[1];
-            SelectedImage = Images[0];
+            _SelectedTransition = PageTransitions[1];
+            _SelectedImage = Images[0];
         }
 
         public List<PageTransition> PageTransitions { get; } = new List<PageTransition>();
@@ -160,12 +160,12 @@ namespace ControlCatalog.ViewModels
         public string DisplayTitle { get; }
 
 
-        private IPageTransition _Transition;
+        private IPageTransition? _Transition;
 
         /// <summary>
         /// Gets or sets the transition
         /// </summary>
-        public IPageTransition Transition
+        public IPageTransition? Transition
         {
             get { return _Transition; }
             set { this.RaiseAndSetIfChanged(ref _Transition, value); }
@@ -201,7 +201,7 @@ namespace ControlCatalog.ViewModels
         /// </summary>
         public TimeSpan Duration { get; set; }
 
-        public async Task Start(Visual from, Visual to, bool forward, CancellationToken cancellationToken)
+        public async Task Start(Visual? from, Visual? to, bool forward, CancellationToken cancellationToken)
         {
             if (cancellationToken.IsCancellationRequested)
             {
@@ -293,7 +293,7 @@ namespace ControlCatalog.ViewModels
         /// <remarks>
         /// Any one of the parameters may be null, but not both.
         /// </remarks>
-        private static IVisual GetVisualParent(IVisual from, IVisual to)
+        private static IVisual GetVisualParent(IVisual? from, IVisual? to)
         {
             var p1 = (from ?? to)!.VisualParent;
             var p2 = (to ?? from)!.VisualParent;

+ 2 - 2
samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs

@@ -92,7 +92,7 @@ namespace ControlCatalog.ViewModels
 
         public class Node
         {
-            private ObservableCollection<Node> _children;
+            private ObservableCollection<Node>? _children;
             private int _childIndex = 10;
 
             public Node()
@@ -106,7 +106,7 @@ namespace ControlCatalog.ViewModels
                 Header = parent.Header + ' ' + index;
             }
 
-            public Node Parent { get; }
+            public Node? Parent { get; }
             public string Header { get; }
             public bool AreChildrenInitialized => _children != null;
             public ObservableCollection<Node> Children => _children ??= CreateChildren();