AvaloniaILSpy icon indicating copy to clipboard operation
AvaloniaILSpy copied to clipboard

Upgrade Avalonia v11

Open DamianSuess opened this issue 1 year ago • 12 comments

NOTE: This upgrade is a work-in-progress

Feature Includes:

  • Upgrade from Avalonia v0.10.x to v11.0.0
  • Added EditorConfig for VS styling and basic coding standards

References

Avalonia Changes

  • AvaloniaProperty.Register<T>(..) deprecated notifying argument.
    • https://github.com/AvaloniaUI/Avalonia/commit/4fc1995246b2e35574a95e7f7be61d27dc2cc144
    • Deprected v11-preview6 https://github.com/AvaloniaUI/Avalonia/pull/10336
    • https://docs.avaloniaui.net/docs/authoring-controls/defining-properties
    • Use: protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
    • Reference: https://github.com/AvaloniaUI/Avalonia/issues/10088
  • Deprecated: ForegroundBrush { get; set; }, Use method, SetForegroundBrush(...)

Pending Fixes

  • [ ] CaretHighlightAdorner.cs
    • TextBlock does not contain a definition for GetForeground
    • No overload method for RunAsync takes 3 arguments
  • [ ] ContextMenuEntry.cs
    • ContextMenu does not contain definition for ContextMenuOpening
  • [x] CopyFullyQualifiedNameContextMenuEntry.cs
    • Application does not contain a definition for Clipboard
  • [ ] CreateListDialog.xaml.cs
    • [ ] Cannot convert lambda expression to IObserver<string> because it is not a delegate type
    • [x] Application does not contain a definition for FocusManager
  • [ ] CustomDialog.xaml.cs
    • Cannot convert from Avalonia.StyledElement to Avalonia.Controls.Control
  • [ ] DecompilerTextView.xaml.cs
    • IWindowImpl does not contain a definition for MouseDevice
    • IPointerDevice does not contain a definition for GetPosition
    • FontManager does not contain a definition for GetInstalledForntFamilyNames
    • FontManager does not contain a definition for DefaultFontFamilyName
  • [ ] Images.cs
    • [ ] AvaloniaLocator does not contain a definition for Current
      • Deprecated: AvaloniaLocator.Current.GetService<T>
      • Usage: ...GetService<IPlatformRenderInterface>().CreateRenderTarget(...)
    • [ ] Bitmap does not contain definition for PlatformImpl (x3)
  • [ ] PlatformDependentWindow.cs
    • ITopLevelImpl.Input is inaccessable due to its protection level
    • RawKeyEventArgs does not contain a definition for Modifiers - Ava v11 is now [PrivateApi] and internal
    • RawKeyEventArgs does not contain a definition for Key
  • [x] ResourceObjectTable.xaml.cs
    • Application does not contain a definition for Clipboard
  • [x] ResourceStringTable.xaml.cs
    • Application does not contain a definition for Clipboard
  • [x] SearchPane.xaml.cs
    • The best overload for Register does not have a parameter named notifing
      • Deprecated: AvaloniaProperty.Register<T>(..) deprecated notifying argument in v11.0-preview6.
      • Ref: https://github.com/AvaloniaUI/Avalonia/discussions/10766
      • Ref: https://github.com/AvaloniaUI/Avalonia/issues/10088
  • [x] TextMarkerService.cs
    • [x] Cannot convert AvaloniaEdit.Document.ISegment to int
      • Deprecated method overload: TextView.Redraw(ISegment, DispatcherPriority)
      • NEW: TextView.Redraw(ISegment)
    • [x] Property VisualLineElementTextRunProperties.ForegroundBrush cannot be assigned - It's read only.
      • NEW: Use, element.TextRunProperties.SetForegroundBrush(foregroundBrush);
  • [x] ThreadingSupport.cs
    • Application does not contain a definition for Clipboard

Notes

  • AvaloniaLocator has been removed
    • https://docs.avaloniaui.net/docs/next/stay-up-to-date/upgrade-from-0.10#locator
    • https://github.com/AvaloniaUI/Avalonia/pull/11557
  • protected override ... CreateItemContainerGenerator()
    • This is not overridable. Marked as obsolete
    • private protected virtual ItemContainerGenerator CreateItemContainerGenerator()
  • IItemContainerGenerator -> ItemContainerGenerator
  • ItemContainerEventArgs has been deprecated
  • MainWindow.HandleWindowStateChanged has been deprecated in v11
    • NOTE: Undocumented
    • https://github.com/AvaloniaUI/Avalonia/discussions/11593
    • Use protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)

Stretch TO-DO

  • Rename .xaml to .axaml

Overview of Changes Made

  • IBitmap -> Bitmap
  • FocusManager
  • WbFb : IFramebufferPlatformSurface now implements CreateFramebufferRenderTarget() - https://github.com/AvaloniaUI/Avalonia/pull/11914

Focus Manager

OpenListDialog.xaml.cs

// Avalonia v0.10
//// TemplateApplied += (sender, e) => Application.Current.FocusManager.Focus(listView);

TemplateApplied += (sender, e) => {
  // Avalonia v11
  var focusManager = TopLevel.GetTopLevel(listView).FocusManager;
  focusManager.GetFocusedElement().Focus();
};

Clipboard

// v0.10
App.Current.Clipboard.SetTextAsync(sb.ToString());

// v11.0 - TopLevel
var clipboard = TopLevel.GetTopLevel(this)?.Clipboard;
clipboard.SetTextAsync(sb.ToString());

// v11.0 - Main Window
var clipboard = App.Current.GetMainWindow()?.Clipboard;
clipboard.SetTextAsync(member.ReflectionName);

DamianSuess avatar Jul 24 '23 02:07 DamianSuess

Avalonia-v11-Update.md - please add that to the description of the PR but remove the file

christophwille avatar Jul 24 '23 05:07 christophwille

Please rebase on latest master - because then the build automation fixes I made will kick in.

christophwille avatar Jul 24 '23 10:07 christophwille

Wonderful, thanks for the heads up on both areas @christophwille. This upgrade isn't as smooth as I'd like it to be, but it was expected considering there are a lot of breaking changes moving to v11.

I'm trying to keep tabs on the undocumented Avalonia v11 upgrade areas and making updates for their docs as well.

DamianSuess avatar Jul 24 '23 12:07 DamianSuess

Really appreciate you providing feedback to the Avalonia project!

christophwille avatar Jul 24 '23 12:07 christophwille

How are things going? How bad is it?

christophwille avatar Aug 01 '23 10:08 christophwille

Hi @christophwille, though it's not as straightforward as I'd like it to be, it is going well.

The biggest part of the slow turnaround comes down to time prioritization during the summer months. It's the usual adult life items: open-source projects, fixing my house, working on a new startup, rewind-repeat.

DamianSuess avatar Aug 02 '23 15:08 DamianSuess

I didn't forget about this repo. Daytime job got very busy as we're aiming to deliver a lot in Q3. I aim to see this completed and will wrap this upgrade up as time allows.

DamianSuess avatar Sep 09 '23 16:09 DamianSuess

How does it look like on your end - got a little time to chip away at this?

christophwille avatar Nov 26 '23 17:11 christophwille

Thanks Chris for the tap on the shoulder, things got super busy at work over the past few months (got to love layoff/fire season).

I'll get back on track for you sir with Christmas vacation time coming up soon

DamianSuess avatar Nov 26 '23 19:11 DamianSuess

Decided to try to get this to build and run, and surprisingly, I did get it to run in some capacity. The decompiler output isn't displaying anything, and frankly, more things are broken than working (including some outright commented out bits), but I hope I got at least some things right - the treeview appears to be functioning correctly!

Screenshot

image

I put up the changes on https://github.com/KubeRoot/AvaloniaILSpy/tree/UpgradeAvalonia11-WIP, but I didn't care much for code quality with this, so not sure how much of this is usable. If I figure out more details, I might make a PR to your repository, if you don't mind.

EDIT: Small update, figured out the errors I've made with some things. Code is now rendering, the menu and toolbar are populated, font selection is working. I might try to figure out how theming should work, but I can see a few big issues that I don't know how to tackle, like generating the icons and PlatformDependentWindow

KubeRoot avatar Nov 30 '23 23:11 KubeRoot

@DamianSuess @KubeRoot @christophwille please let me know if you need any help with this upgrade.

Although, I am wondering if it might be better to recreate this project from latest WPF-version sources.

maxkatz6 avatar Jan 15 '24 07:01 maxkatz6

@maxkatz6 please coordinate the porting / adaptation work with @DamianSuess (I don't know about his plans or available time)

christophwille avatar Jan 15 '24 09:01 christophwille