Visitar URL original
Remove `DependencyObjectStore` by MartinZikmund · Pull Request #23702 · unoplatform/uno · GitHub
Skip to content

Remove DependencyObjectStore - #23702

Merged
MartinZikmund merged 13 commits into
feature/breakingchangesfrom
dev/mazi/dostore
Aug 14, 2026
Merged

MartinZikmund merged 13 commits into
feature/breakingchangesfrom
dev/mazi/dostore

Conversation

@MartinZikmund

@MartinZikmund MartinZikmund commented Jul 9, 2026 •

Copy link
Copy Markdown
Member

GitHub Issue: Part of #8339 — also advances unoplatform/uno-private#2055 (DependencyObject should be a class [7.0], BC26) and unoplatform/uno-private#2106 (Internalise Uno-only members leaking into WinUI namespaces).

PR Type:

🔄 Refactoring (no functional changes, but there are API changes — see Breaking changes below)

What changed? 🚀

Phase 2 of DependencyObject should be a class. Phase 1 turned DependencyObject from an interface into a real class on every target, but the property-system state still lived in a separate DependencyObjectStore object that each DependencyObject created lazily and reached through IDependencyObjectStoreProvider.

This PR dissolves that store into DependencyObject itself and removes the indirection:

  • The 8 DependencyObjectStore.* partials are git mv-ed to DependencyObject.* (a pure rename commit, so the rest of the diff is readable) and then folded into the class.
  • The public DependencyObjectStore type and the IDependencyObjectStoreProvider interface are deleted, and their ~150 call sites across 59 files rewritten: ((IDependencyObjectStoreProvider)x).Store.M() becomes ((DependencyObject)x).M().
  • Store initialisation becomes eager in the constructor. In practice this is close to free: nearly every DependencyObject constructor already touched a dependency property (Setter, Timeline, VisualState, SolidColorBrush, UIElement…), which forced the lazy store into existence anyway.
  • The three weak self-references (_originalObjectRef, _thisWeakRef, _selfWeakReference) collapse into one SelfWeakReference; ActualInstance becomes this.
  • IDisposable is dropped and the store's finalizer becomes ~DependencyObject.

It also minimises what that fold leaves public. After this PR every visible member on DependencyObject is a WinUI member, and every Uno-only member is hidden from IntelliSense:

Members
Visible — all WinUI Dispatcher, DispatcherQueue, GetValue, SetValue, ClearValue, ReadLocalValue, GetAnimationBaseValue, RegisterPropertyChangedCallback, UnregisterPropertyChangedCallback
[EditorBrowsable(Never)] — Uno-only, must stay public because the XAML source generator emits calls into the consuming assembly SetBinding(DependencyProperty, BindingBase), SetBinding(string, BindingBase), TemplatedParent, TemplatedParentProperty

On the finalizer

Folding the store moves the finalizer onto DependencyObject. The count of finalizable objects per DO is unchanged (1 → 1): the old DependencyObjectStore was itself finalizable and nothing ever called its Dispose()/GC.SuppressFinalize. What changes is which object sits on the queue — the element itself rather than a satellite. #23703 removes it entirely.

Validation 🔍

  • Compile: Uno.UI, Uno.UI.UnitTests, Uno.UI.RuntimeTests.Skia and SamplesApp.Skia.Generic, net10.0.
  • Unit tests: 4021 total, 12 failed — all pre-existing When_Gregorian_* timezone failures. 0 regressions.
  • Runtime (Skia Desktop): Given_FrameworkElement_And_Leak, Given_CollectibleAlcAssociations and the Given_UIElement ContextFlyout leak tests — 94/95. The single failure (When_Add_Remove(CommandBarFlyout_Leak, …)) was reproduced identically at the merge base by building and running aff73c4c separately, so it is pre-existing and not caused by this PR.

Breaking changes ❗

All Uno-only; none of it exists in WinUI. Entries recorded in build/PackageDiffIgnore.xml.

Removed types

  • Microsoft.UI.Xaml.DependencyObjectStore (and its nested TraceProvider)
  • Microsoft.UI.Xaml.IDependencyObjectStoreProvider

Removed members

  • DependencyObject.IsStoreInitialized — had become a constant true with no consumer.

Demoted to internal (undocumented, not emitted by any source generator, no in-repo consumer outside InternalsVisibleTo assemblies)

  • DependencyObject.SetBinding(object, string, BindingBase)
  • DependencyObject.SetBindingValue(object, string)
  • DependencyObject.GetBindingExpression(DependencyProperty)
  • DependencyObject.SuspendBindings() / DependencyObject.ResumeBindings()

Migration: code using ((IDependencyObjectStoreProvider)x).Store.M() should call ((DependencyObject)x).M() directly. GetBindingExpression is the most likely of the demoted members to be in use outside this repo — say so on the PR if that affects you and it can be re-exposed as public + [EditorBrowsable(Never)].

PR Checklist ✅

@github-actions github-actions Bot added area/skia ✏️ Categorizes an issue or PR as relevant to Skia area/build Categorizes an issue or PR as relevant to build infrastructure area/automation Categorizes an issue or PR as relevant to project automation kind/documentation labels Jul 9, 2026
@github-actions

github-actions Bot commented Jul 9, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @MartinZikmund's task in 8m 26s —— View job


PR Review: Remove DependencyObjectStore

  • Load review tools
  • Analyze the diff and key changed files
  • Review DependencyObject.Store.cs (core merge)
  • Review DependencyObject.cs and DependencyObject.Binder.cs
  • Review other changed files for correctness
  • Post inline comments for findings
  • Post review summary

Summary

Verdict: ship (with one trivial cleanup)

This is a correct and well-structured fold of DependencyObjectStore into DependencyObject. 88 files changed, mostly mechanical renames of IDependencyObjectStoreProvider / provider.Store.* → direct DependencyObject casts. The architectural intent is sound and the implementation follows through cleanly.

What was verified:

  • Eager init: The constructor now eagerly initializes _properties (and the binder) where the store was previously lazy. SelfWeakReference is safe to call from the constructor because it's a null-coalescing property that allocates on first access — the object exists in memory at that point.
  • ActualInstance => this: Correct. The old _owner field / _originalObjectRef indirection is gone; this is always the actual instance now.
  • AttachedDependencyObject: Correctly threads the foreign owner through the new private protected DependencyObject(object? originalObject) base constructor so initialization sees the right type during base construction.
  • _parentDataContextProperty initializer: Safe — it's an instance-field initializer (not a static one), so it fires when the first instance is created; by that point the runtime will have triggered FrameworkElement's static init, which is fine since both types live in the same assembly.
  • ClearBindings() / RestoreBindings(): Still public, still [EditorBrowsable(EditorBrowsableState.Never)] in DependencyObject.Binder.cs. Not regressed.
  • PackageDiffIgnore.xml: DependencyObjectStore.* and IDependencyObjectStoreProvider entries are correct and cover all removed public surface.
  • FrameworkElement.Parent: public new DependencyObject Parent correctly shadows the internal object? Parent from the store partial; casting to (DependencyObject)this avoids infinite recursion because the store's Parent is non-virtual.
  • #if UNO_HAS_ENHANCED_LIFECYCLE new keyword sites (FlyoutBase.Enter/Leave, KeyboardAccelerator.EnterImpl, KeyboardAcceleratorCollection.Enter/Leave, StateTrigger.IsActive, ProgressRing.IsActive): pattern is necessary and consistent.
  • No event Action violations, no async void, no .Result/.GetAwaiter().GetResult() blocking calls added in this diff.

One finding:

DependencyObject.Store.cs line 19 carries using Windows.ApplicationModel.Calls; — this namespace is not referenced anywhere in the file. It's a stale import that survived the rename from DependencyObjectStore.Store.cs unchanged. using Microsoft.UI.Xaml.Controls; on line 20 IS used (for Control.ForegroundProperty, TextBlock.ForegroundProperty, etc.), so only the Calls import needs to go.

Severity Count Notes
Low 1 Unused using Windows.ApplicationModel.Calls; in DependencyObject.Store.cs:19

PR body note: The GitHub issue field is empty (closes #). Per AGENTS.md, every PR must reference an associated issue unless it's a pure documentation change.

@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your WebAssembly Skia Sample App stage site is ready! Visit it here: https://unowasmprstaging.z20.web.core.windows.net/pr-23702/wasm-skia-net9/index.html

@nventive-devops

Copy link
Copy Markdown
Contributor

The build 221475 found UI Test snapshots differences: skia-linux-screenshots: 72, skia-windows-screenshots: 80

Details
  • skia-linux-screenshots: 72 changed over 2368

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • ElementLevelTheme.png-dark
    • ElementLevelTheme.png
    • Examples.png
    • Gamepad_Enumeration.png-dark
    • Gamepad_Enumeration.png
    • Focus_FocusVisual_Properties.png-dark
    • Focus_FocusVisual_Properties.png
    • ContentControl_Inheritance.png
    • EllipsemaskingEllipseGrid.png
    • DynamicFont.png-dark
    • DynamicFont.png
    • ImageSourceUrlMsAppDataScheme.png
    • ImageBrushWithRotateTransform.png
    • Buttons.png
    • ClipboardTests.png-dark
    • Gamepad_CurrentReading.png-dark
    • Gamepad_CurrentReading.png
    • Image_AnimatedWebP.png-dark
  • skia-windows-screenshots: 80 changed over 2368

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • Focus_FocusVisual_Properties.png-dark
    • DisplayInformation.png-dark
    • ImageBrushInList.png-dark
    • ImageBrushInList.png
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • DropDownButtonPage.png-dark
    • DropDownButtonPage.png
    • DoubleImageBrushInList.png-dark
    • Image_UseTargetSize.png-dark
    • ElementLevelTheme.png-dark
    • ElementLevelTheme.png
    • ImageIconPage.png-dark
    • Buttons.png-dark
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png
    • Gamepad_CurrentReading.png-dark
    • ColorPickerSample.png
    • Examples.png
    • ExpanderColorValidationPage.png-dark

@github-actions

github-actions Bot commented Jul 13, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @MartinZikmund's task in 7m 31s —— View job


PR Review: Remove DependencyObjectStore

  • Load review tools
  • Analyze diff vs origin/feature/breakingchanges
  • Review DependencyObject.Store.cs and DependencyObject.cs
  • Review DependencyObject.Binder.cs and TemplatedParentScope.cs
  • Check AttachedDependencyObject, FrameworkElement.Parent, new-keyword sites
  • Check for cross-cutting issues (events, async, allocations)
  • Post inline comments for findings
  • Post review summary

Summary

Verdict: ship (one stale import to clean up before merge)

This is the fifth commit (fad2f497 fix: Address DO-store merge review findings) appended since the last review. The fix commit correctly addressed the two defects from the adversarial review:

  • Given_xLoad.cs: Restored the intended non-null assertion (setup.LazyControl as DependencyObject)! (the .Store strip had produced uncompilable ?!).
  • Public API surface: ClearValue, ReadLocalValue, GetAnimationBaseValue, RegisterPropertyChangedCallback, UnregisterPropertyChangedCallback are now correctly exposed as nullable-oblivious dp-named wrappers in DependencyObject.cs, delegating to *Internal methods in the store partial. Named-arg and nullable-strict call-sites are not broken.

What was verified in this pass:

  • _originalObjectType initialization for AttachedDependencyObject — DependencyObject(object? originalObject) sets effectiveOwner = originalObject ?? this, which for AttachedDependencyObject(object owner) : base(owner) resolves to owner.GetType(). This matches the old DependencyObjectStore behavior (originalObject is AttachedDependencyObject a ? a.Owner.GetType() : originalObject.GetType()).
  • ActualInstance => this — correct for both regular DOs and AttachedDependencyObject (the old code also returned the ADO itself, not the wrapped POCO).
  • _properties = new DependencyPropertyDetailsCollection(SelfWeakReference, ...) — safe in constructor; SelfWeakReference lazy-inits via ??= on first access, allocating the ManagedWeakReference against the live this.
  • TemplatedParentScope — store: this correctly passes the DependencyObject (no longer a separate DependencyObjectStore). The (store ?? provider).SetTemplatedParent2/ApplyTemplateBindings() calls compile and dispatch correctly.
  • FrameworkElement.Parent (public new DependencyObject Parent) — ((DependencyObject)this).Parent resolves at compile time to DependencyObject.Parent (internal object?), not back to FrameworkElement.Parent. No infinite recursion.
  • PackageDiffIgnore.xml — regex entries covering DependencyObjectStore.*, IDependencyObjectStoreProvider, and their members (Types/Fields/Properties/Methods sections) are correct and comprehensive.
  • No event Action / event Action<T>, no async void without try/catch, no .Result/.GetAwaiter().GetResult() added in this diff.

One outstanding finding (unchanged from the July 9 review):

src/Uno.UI/UI/Xaml/DependencyObject.Store.cs line 19 carries using Windows.ApplicationModel.Calls; — this namespace is not referenced anywhere in the file. It survived the rename from DependencyObjectStore.Store.cs unchanged and was not removed in the fix commit. The line falls outside the unified diff hunk so a GitHub inline comment can't attach to it; flagging here instead. Drop it before merge.

Snapshot differences note:

CI reports 72 linux / 80 windows snapshot changes. Since this PR is a pure structural refactor (no rendering logic changed), these differences are almost certainly noise from the base feature/breakingchanges branch (which contains concurrent rendering changes). The screenshot-compare baseline and this PR's renames are independent; the differences should be reviewed against the base branch's own snapshot delta, not attributed to this refactor.

Severity Count Notes
Low 1 Stale using Windows.ApplicationModel.Calls; in DependencyObject.Store.cs:19 — not in diff, fix inline

@MartinZikmund
MartinZikmund marked this pull request as ready for review July 13, 2026 13:36
@github-actions

github-actions Bot commented Jul 13, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @MartinZikmund's task in 3m 2s —— View job


PR Review: Remove DependencyObjectStore

  • Load review tools
  • Analyze diff vs origin/feature/breakingchanges
  • Review DependencyObject.Store.cs for the stale using directive
  • Check for any new issues since the last review pass
  • Post inline comments for findings
  • Post review summary

Verdict: ship — one pre-merge cleanup still outstanding.

This pass reviewed the five commits on this branch (e5c1913f → fad2f497). The structural fold of DependencyObjectStore into DependencyObject is correct and consistent. All IDependencyObjectStoreProvider / .Store.* indirections have been cleanly replaced with direct DependencyObject casts. The fad2f497 fix commit correctly addressed the two defects surfaced in the July 13 adversarial review.

What was verified in this pass:

  • IsStoreInitialized => true is correct: the store is always initialized (eagerly, in the constructor), so there is no condition under which this can be false.
  • ActualInstance => this (line 1825) is correct.
  • DependencyObjectExtensions.GetStore / GetAttachedStore: type narrowed from IDependencyObjectStoreProvider/DependencyObjectStore to DependencyObject — semantically equivalent.
  • FrameworkElement.Parent (public new DependencyObject): ((DependencyObject)this).Parent resolves at compile time to DependencyObject.Parent (internal object? at line 122) — no infinite recursion.
  • PackageDiffIgnore.xml — regex patterns cover DependencyObjectStore.* and IDependencyObjectStoreProvider across Types, Fields, Properties, and Methods sections.
  • source-generators.md — correctly updated to reflect that DependencyObject is now a class, not an interface backed by a generated store.
  • No event Action/event Action<T>, no async void without try/catch, no .Result/.GetAwaiter().GetResult() added in this diff.

One outstanding finding (unchanged across all three review passes):

src/Uno.UI/UI/Xaml/DependencyObject.Store.cs line 19 carries:

using Windows.ApplicationModel.Calls;

This namespace is not referenced anywhere in the file — the import is stale, carried over from the original DependencyObjectStore.Store.cs via the rename. Because the line was never touched in any commit, GitHub cannot anchor an inline comment to it. The Microsoft.UI.Xaml.Controls import on line 20 is used (Control.ForegroundProperty, TextBlock.ForegroundProperty), so only the Calls import needs to go.

Fix this →

Severity Count Notes
Low 1 Stale using Windows.ApplicationModel.Calls; in DependencyObject.Store.cs:19 — not in diff, must be fixed inline before merge

@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your WebAssembly Skia Sample App stage site is ready! Visit it here: https://unowasmprstaging.z20.web.core.windows.net/pr-23702/wasm-skia-net9/index.html

@nventive-devops

Copy link
Copy Markdown
Contributor

The build 222036 found UI Test snapshots differences: skia-linux-screenshots: 73, skia-windows-screenshots: 89

Details
  • skia-linux-screenshots: 73 changed over 2368

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png
    • Examples.png-dark
    • Examples.png
    • Focus_FocusVisual_Properties.png-dark
    • Focus_FocusVisual_Properties.png
    • Gamepad_CurrentReading.png-dark
    • Basics Pivot Test.png
    • Buttons.png-dark
    • Buttons.png
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • ColorPickerSample.png
    • ClipboardTests.png-dark
    • ClipboardTests.png
    • DataTransferManager.png
    • DisplayInformation.png-dark
    • DisplayInformation.png
    • DynamicFont.png-dark
    • DynamicFont.png
  • skia-windows-screenshots: 89 changed over 2368

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • DisplayInformation.png-dark
    • DisplayInformation.png
    • Gamepad_CurrentReading.png-dark
    • Image_UseTargetSizeLate.png
    • DoubleImageBrushInList.png-dark
    • DoubleImageBrushInList.png
    • Image_AnimatedWebP.png
    • ContentPresenter_NativeEmbedding_ZIndex.png
    • Examples.png-dark
    • Examples.png
    • ExpanderColorValidationPage.png-dark
    • ExpanderColorValidationPage.png
    • ImageBrushInList.png-dark
    • Image_Margin_Large.png
    • ImageBrushInList.png
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png
    • ImageIconPage.png-dark
    • ImageIconPage.png
    • Buttons.png-dark

@github-actions

github-actions Bot commented Jul 14, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @MartinZikmund's task in 2m 22s —— View job


PR Review: Remove DependencyObjectStore

  • Load review tools
  • Analyze new diff vs origin/feature/breakingchanges
  • Check DependencyObject.Store.cs for the stale using directive
  • Review any new changes since the last review pass
  • Attempted inline comment (blocked — line not in diff hunk due to rename detection)
  • Apply fix directly to branch (blocked — push permission denied)
  • Post review summary

Verdict: ship — one pre-merge cleanup, same as the previous three passes.

This pass reviewed the five commits on this branch. No new issues were introduced. The structural fold of DependencyObjectStore into DependencyObject is correct and consistent. All findings from the July 9 and July 13 review passes remain addressed except the one below.

What was verified in this pass:

  • No event Action/event Action<T>, no async void, no .Result/.GetAwaiter().GetResult() added.
  • DependencyObject.cs wrappers (GetValue, SetValue, ClearValue, ReadLocalValue, GetAnimationBaseValue, RegisterPropertyChangedCallback, UnregisterPropertyChangedCallback) correctly delegate to *Internal counterparts — public surface matches the historical interface-era signatures.
  • IsStoreInitialized => true is correct: the store is always eagerly initialized in the constructor.
  • All other cross-cutting concerns checked in the previous passes remain valid.

One outstanding finding (unchanged across all four review passes):

src/Uno.UI/UI/Xaml/DependencyObject.Store.cs line 19 carries:

using Windows.ApplicationModel.Calls;

This namespace is not referenced anywhere in the file — the import is stale, carried over from the original DependencyObjectStore.Store.cs via the rename. GitHub cannot anchor an inline comment to it because the line falls outside any diff hunk (rename-detected files only show changed lines in the review UI). The Microsoft.UI.Xaml.Controls import on the next line IS used, so only the Calls import needs to go.

I attempted to apply and push this fix (8c2fe697) but the push was denied (GitHub Actions bot lacks push permission to this repository). Please apply the fix manually:

# In DependencyObject.Store.cs, remove line 19:
using Windows.ApplicationModel.Calls;

Fix this →

Severity Count Notes
Low 1 Stale using Windows.ApplicationModel.Calls; in DependencyObject.Store.cs:19 — fix by deleting that line

@MartinZikmund
MartinZikmund enabled auto-merge July 14, 2026 14:09
@nventive-devops

Copy link
Copy Markdown
Contributor

The build 222325 found UI Test snapshots differences: skia-linux-screenshots: 68, skia-windows-screenshots: 88

Details
  • skia-linux-screenshots: 68 changed over 2368

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • EllipsemaskingEllipseGrid.png
    • Gamepad_CurrentReading.png-dark
    • DisplayInformation.png-dark
    • DynamicFont.png-dark
    • DynamicFont.png
    • Buttons.png-dark
    • Buttons.png
    • CornerRadiusControls.png
    • DoubleImageBrushInList.png-dark
    • DoubleImageBrushInList.png
    • ElementLevelTheme.png-dark
    • Focus_FocusVisual_Properties.png-dark
    • ImageBrushInList.png-dark
    • ImageBrushInList.png
    • Gamepad_Enumeration.png-dark
    • ClipboardTests.png-dark
    • ClipboardTests.png
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png
    • CompositionPath.png
  • skia-windows-screenshots: 88 changed over 2368

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • Gamepad_CurrentReading.png-dark
    • Image_AnimatedWebP.png-dark
    • ImageBrushInList.png-dark
    • ImageBrushInList.png
    • Examples.png
    • ExpanderColorValidationPage.png-dark
    • ExpanderColorValidationPage.png
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • ColorPickerSample.png
    • ImageIconPage.png-dark
    • ImageIconPage.png
    • Basics Pivot Test.png
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png
    • ClipboardTests.png-dark
    • ClipboardTests.png
    • Buttons.png-dark
    • Buttons.png
    • ElementLevelTheme.png-dark

Copilot AI lite review requested due to automatic review settings August 11, 2026 08:15
@github-actions

github-actions Bot commented Aug 11, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @MartinZikmund's task in 2m 18s —— View job


PR Review: Remove DependencyObjectStore

  • Load review tools
  • Analyze diff vs origin/feature/breakingchanges
  • Review DependencyObject.Store.cs for the stale using directive
  • Attempt to apply and push the fix (blocked — push permission denied)
  • Attempted inline comment (blocked — line not in diff hunk due to rename detection, same as previous passes)
  • Post review summary

Verdict: ship — one pre-merge cleanup, same as the previous four passes.

This pass reviewed the five commits on this branch (a2bd2d3c → a97b0011). No new issues were introduced in the latest synchronize. The structural fold of DependencyObjectStore into DependencyObject is correct and consistent.

What was verified:

  • source-generators.md correctly updated — DependencyObject is now a concrete base class; the generator no longer emits store/GetValue/SetValue machinery.
  • DependencyObject.cs public wrappers (GetValue, SetValue, ClearValue, ReadLocalValue, GetAnimationBaseValue, RegisterPropertyChangedCallback, UnregisterPropertyChangedCallback) all delegate to *Internal counterparts — public surface matches the historical interface-era signatures.
  • IsStoreInitialized => true is correct (the store is always eagerly initialized in the constructor).
  • No event Action/event Action<T>, no async void without try/catch, no .Result/.GetAwaiter().GetResult() added in this diff.
  • All cross-cutting concerns from prior passes remain verified.

One outstanding finding (unchanged across all five review passes):

src/Uno.UI/UI/Xaml/DependencyObject.Store.cs line 19 carries:

using Windows.ApplicationModel.Calls;

This namespace is not referenced anywhere in the file — the import is stale, carried over from the original DependencyObjectStore.Store.cs via the rename. GitHub cannot anchor an inline comment because rename-detected files only show changed hunks in the review UI, and this line was never modified. I prepared and committed the fix locally but the push was denied (GitHub Actions bot lacks write permission to this repository).

Please apply manually:

# In src/Uno.UI/UI/Xaml/DependencyObject.Store.cs, delete line 19:
sed -i '/^using Windows\.ApplicationModel\.Calls;$/d' src/Uno.UI/UI/Xaml/DependencyObject.Store.cs
git add src/Uno.UI/UI/Xaml/DependencyObject.Store.cs
git commit -m "chore: Remove stale using Windows.ApplicationModel.Calls in DependencyObject.Store.cs"
Severity Count Notes
Low 1 Stale using Windows.ApplicationModel.Calls; in DependencyObject.Store.cs:19 — fix by deleting that line

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors Uno’s dependency-property “store” implementation by folding DependencyObjectStore into DependencyObject itself and removing the IDependencyObjectStoreProvider indirection, with broad call-site updates across theming/resource binding, parent tracking, enter/leave lifecycle, and related tests/docs.

Changes:

  • Remove DependencyObjectStore / IDependencyObjectStoreProvider and move store logic onto DependencyObject partials.
  • Update XAML/theming/resource-resolution/lifecycle code paths to call DependencyObject APIs directly.
  • Update unit/runtime tests and internal docs/tooling notes to match the new model.

Reviewed changes

Copilot reviewed 87 out of 87 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/Uno.UI/UI/Xaml/VisualTransition.cs Switch storyboard resource-binding update to DependencyObject APIs.
src/Uno.UI/UI/Xaml/VisualStateGroup.cs Replace theme-walk tracking via store provider with DependencyObject property.
src/Uno.UI/UI/Xaml/VisualState.cs Update storyboard parent assignment to use DependencyObject directly.
src/Uno.UI/UI/Xaml/UIElementCollection.cs Parent cleanup now checks DependencyObject instead of store provider.
src/Uno.UI/UI/Xaml/UIElement.Properties.cs Comment updates referencing DependencyObject binder.
src/Uno.UI/UI/Xaml/UIElement.mux.cs Route lifecycle/theming calls through DependencyObject instead of store.
src/Uno.UI/UI/Xaml/UIElement.debugging.cs Debug helper reads bindings from DependencyObject directly.
src/Uno.UI/UI/Xaml/UIElement.cs Remove now-redundant UIElement theme forwarders; use DependencyObject methods.
src/Uno.UI/UI/Xaml/UIElement.crossruntime.cs Mentor/DataContext propagation now uses DependencyObject methods.
src/Uno.UI/UI/Xaml/ThemeResolution.cs Theme resolution reads per-object theme from DependencyObject.
src/Uno.UI/UI/Xaml/TemplatedParentScope.cs Replace DependencyObjectStore parameters with DependencyObject.
src/Uno.UI/UI/Xaml/Style/Style.cs Resource binding refresh via DependencyObject.UpdateResourceBindings.
src/Uno.UI/UI/Xaml/StateTrigger.cs Conditional new for IsActive property under enhanced lifecycle.
src/Uno.UI/UI/Xaml/ResourceResolver.cs Theme/resource binding registration via DependencyObject directly.
src/Uno.UI/UI/Xaml/ResourceDictionary.cs Update theme-notify / theme-bindings propagation to new DO APIs.
src/Uno.UI/UI/Xaml/ResourceDictionary.alc.cs Update collectible ALC sweep to operate on DependencyObject.
src/Uno.UI/UI/Xaml/ModifiedValue.cs Use DependencyObject.AreDifferent for value comparisons.
src/Uno.UI/UI/Xaml/Media/Animation/ObjectAnimationUsingKeyFrames.cs Keyframe theme resource updates via DependencyObject.
src/Uno.UI/UI/Xaml/Markup/Reader/XamlObjectBuilder.cs Deferred static resource binding updates tracked as DependencyObject.
src/Uno.UI/UI/Xaml/Internal/EventManager.uno.cs GC race checks use DependencyObject.IsDisposed.
src/Uno.UI/UI/Xaml/Internal/DependencyPropertyHelper.cs DP inspection uses DependencyObject instead of store provider.
src/Uno.UI/UI/Xaml/Input/KeyboardAccelerator/KeyboardAcceleratorCollection.h.mux.cs Add new Enter/Leave to avoid hiding base DO lifecycle under enhanced lifecycle.
src/Uno.UI/UI/Xaml/Input/KeyboardAccelerator/KeyboardAccelerator.mux.cs Add new EnterImpl to avoid hiding base DO lifecycle under enhanced lifecycle.
src/Uno.UI/UI/Xaml/IDependencyObjectProvider.cs Remove IDependencyObjectStoreProvider interface (deleted).
src/Uno.UI/UI/Xaml/FrameworkTemplatePool.cs Template reuse cleanup sets DependencyObject.Parent directly.
src/Uno.UI/UI/Xaml/FrameworkPropertyMetadataOptions.cs Update doc reference to DependencyObject.ApplyCoercion.
src/Uno.UI/UI/Xaml/FrameworkElementExtensions.cs Non-Uno DP binding now calls DependencyObject.SetBinding.
src/Uno.UI/UI/Xaml/FrameworkElement.Theming.cs Theme inheritance reads per-object theme from DependencyObject.
src/Uno.UI/UI/Xaml/FrameworkElement.cs Parent/templated-parent and element-name binding hooks use DependencyObject.
src/Uno.UI/UI/Xaml/EnterParams.cs Replace ThemeInheritanceCaller type to DependencyObject.
src/Uno.UI/UI/Xaml/Documents/TextElement.cs Theme bookkeeping uses DependencyObject.SetLastUsedTheme.
src/Uno.UI/UI/Xaml/DependencyPropertyDetailsCollection.cs Hot reload cloning uses DependencyObject references.
src/Uno.UI/UI/Xaml/DependencyPropertyDetailsCollection.Bindings.cs Update doc to reference DependencyObject.UpdateResourceBindings.
src/Uno.UI/UI/Xaml/DependencyPropertyDetails.cs Update doc to reference DependencyObject instead of store.
src/Uno.UI/UI/Xaml/DependencyPropertyCallbackManager.cs Update debug comment to reference DependencyObject dispose.
src/Uno.UI/UI/Xaml/DependencyProperty.cs Use DependencyObject.AreDifferent in metadata comparison.
src/Uno.UI/UI/Xaml/DependencyObjectExtensions.cs Attached-store helpers now treat the “store” as DependencyObject itself.
src/Uno.UI/UI/Xaml/DependencyObjectCollection.cs Parent-change callback registration moved onto DependencyObject.
src/Uno.UI/UI/Xaml/DependencyObject.Theming.cs Port theming layer onto DependencyObject partial.
src/Uno.UI/UI/Xaml/DependencyObject.Store.cs Fold store implementation into DependencyObject and adjust access levels.
src/Uno.UI/UI/Xaml/DependencyObject.PropertySystem.mux.cs Enter/Leave property-walk now targets DependencyObject.
src/Uno.UI/UI/Xaml/DependencyObject.mux.cs Lifecycle Enter/Leave implementation moved to DependencyObject partial.
src/Uno.UI/UI/Xaml/DependencyObject.DependencyPropertyChangedEventArgsPool.cs Pool is now part of DependencyObject partial.
src/Uno.UI/UI/Xaml/DependencyObject.cs Public DP API forwards to internal DependencyObject implementation methods.
src/Uno.UI/UI/Xaml/DependencyObject.Binder.cs Binder implementation moved to DependencyObject partial; adjust access levels.
src/Uno.UI/UI/Xaml/DependencyObject.AncestorsDictionary.cs Ancestor tracking moved to DependencyObject partial.
src/Uno.UI/UI/Xaml/DependencyObject.alc.cs Collectible ALC association tracking updated to DependencyObject.
src/Uno.UI/UI/Xaml/Data/ThemeResourceReference.cs Documentation updated to reference DependencyObject theming APIs.
src/Uno.UI/UI/Xaml/Data/BindingOperations.cs Binding ops now call DependencyObject.SetBinding.
src/Uno.UI/UI/Xaml/Data/BindingHelper.cs x:Bind and resource binding helpers now call DependencyObject methods.
src/Uno.UI/UI/Xaml/Controls/TreeView/TreeViewNode.cs Add new Parent to hide base DO parent member.
src/Uno.UI/UI/Xaml/Controls/TextBlock/TextBlock.cs Inline theme binding updates routed through DependencyObject.
src/Uno.UI/UI/Xaml/Controls/ProgressRing/ProgressRing.cs Conditional new on IsActive under enhanced lifecycle.
src/Uno.UI/UI/Xaml/Controls/ProgressRing/Legacy/ProgressRing.cs Conditional new on legacy IsActive under enhanced lifecycle.
src/Uno.UI/UI/Xaml/Controls/Popup/Popup.Base.cs DataContext and focus property propagation uses DependencyObject APIs.
src/Uno.UI/UI/Xaml/Controls/Panel/Panel.cs Background transition precedence uses DependencyObject store methods.
src/Uno.UI/UI/Xaml/Controls/MenuFlyout/CommandingHelpers.cs Command binding helpers now call DependencyObject.SetBinding.
src/Uno.UI/UI/Xaml/Controls/ItemsControl/ItemsControl.cs Parent detachment uses DependencyObject checks.
src/Uno.UI/UI/Xaml/Controls/Flyout/FlyoutBase.cs Add new Enter/Leave virtuals under enhanced lifecycle to hide base DO methods.
src/Uno.UI/UI/Xaml/Controls/Control/Control.cs Coercion/inheritance reads use DependencyObject store methods.
src/Uno.UI/UI/Xaml/Controls/ContentPresenter/ContentPresenter.cs Template binding precedence checks use DependencyObject store methods.
src/Uno.UI/UI/Xaml/Controls/ContentControl/ContentControl.HotReload.cs Hot reload property cloning now uses DependencyObject directly.
src/Uno.UI/UI/Xaml/Controls/ContentControl/ContentControl.cs Template root DataContext override logic uses DependencyObject APIs.
src/Uno.UI/UI/Xaml/Controls/Border/Border.cs Background transition precedence uses DependencyObject store methods.
src/Uno.UI/UI/Xaml/AttachedDependencyObject.cs Ensure attached DO passes owner into base ctor for initialization.
src/Uno.UI/UI/Xaml/Application.Alc.cs Update ALC cleanup comment to reference DependencyObject._associatedParent.
src/Uno.UI/FeatureConfiguration.cs Update docs to reference DependencyObject instead of store.
src/Uno.UI/Extensions/DependencyObjectExtensions.mux.depends.cs VisualTree cache reads/writes now go through DependencyObject.
src/Uno.UI/DataBinding/BindingPath.cs Value comparison uses DependencyObject.AreDifferent.
src/Uno.UI/DataBinding/BindingPath.BindingItem.cs DataContext comparisons use DependencyObject.AreDifferent.
src/Uno.UI/DataBinding/BindingExpression.cs Template-parent + DataContext comparisons use DependencyObject APIs.
src/Uno.UI.UnitTests/Windows_UI_Xaml/Given_ThemeResolution.cs Tests updated to set theme/parent via DependencyObject.
src/Uno.UI.UnitTests/Windows_UI_Xaml/Given_ResourceDictionary_DataContext.cs Tests updated to read IsResourceDictionaryItem from DependencyObject.
src/Uno.UI.UnitTests/DependencyProperty/Given_DependencyProperty.Propagation.cs Store lifetime assertions updated to use DependencyObject.
src/Uno.UI.UnitTests/DependencyProperty/Given_DependencyProperty.DefaultValueProvider.cs Default value test now calls DependencyObject.GetDefaultValue.
src/Uno.UI.UnitTests/DependencyProperty/Given_DependencyObject.cs Tests updated for DependencyObject.AreDifferent and hard-ref toggling API.
src/Uno.UI.UnitTests/BinderTests/PhaseBindingTests.cs Binder suspend/resume tests now work through DependencyObject instance.
src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_xLoad.cs Runtime test reads resource bindings from DependencyObject.
src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_UIElement.ContextFlyoutLeak.cs Runtime tests updated to use DependencyObject store for leak assertions.
src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_ThemeResource.cs Runtime tests updated for theme-resource binding APIs on DependencyObject.
src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_Theme_Materialization.cs Runtime tests updated for theme-walk references on DependencyObject.
src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml/Given_FrameworkElement_And_Leak.cs Runtime tests updated for hard-ref toggling on DependencyObject.
src/Uno.UI.RuntimeTests/Tests/Windows_UI_Xaml_Controls/Given_ContentPresenter.cs Commented debug snippet updated for new DO model.
src/Uno.UI.RuntimeTests/Tests/AssemblyLoadContext/Given_CollectibleAlcAssociations.cs Update doc/comments around ALC association field name.
src/Uno.UI.RemoteControl/HotReload/ClientHotReloadProcessor.MetadataUpdate.cs Hot reload property cloning updated to DependencyObject.
build/PackageDiffIgnore.xml Add ignore rules for removed DependencyObjectStore/provider surface (BC26).
.claude/rules/source-generators.md Update generator guidance now that DependencyObject is a concrete store-carrying class.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/Uno.UI/UI/Xaml/StateTrigger.cs Resolved
Comment thread build/PackageDiffIgnore.xml Resolved
@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your Docs stage site is ready! Visit it here: https://unodocsprstaging.z13.web.core.windows.net/pr-23702/docs/index.html

@nventive-devops

Copy link
Copy Markdown
Contributor

The build 226941 found UI Test snapshots differences: skia-linux-screenshots: 74, skia-windows-screenshots: 107

Details
  • skia-linux-screenshots: 74 changed over 2366

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • Examples.png
    • Gamepad_CurrentReading.png-dark
    • Gamepad_CurrentReading.png
    • Gamepad_Enumeration.png-dark
    • Gamepad_Enumeration.png
    • DoubleImageBrushInList.png-dark
    • DynamicFont.png-dark
    • ElementLevelTheme.png-dark
    • ElementLevelTheme.png
    • Buttons.png-dark
    • Buttons.png
    • ImageBrushInList.png-dark
    • ImageBrushInList.png
    • ClipboardTests.png-dark
    • ClipboardTests.png
    • DamageRegion_ShadowChildPaintingCaster.png-dark
    • CalendarView_Theming.png-dark
    • ImageIconPage.png-dark
  • skia-windows-screenshots: 107 changed over 2366

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • Examples.png
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png
    • ClipboardTests.png-dark
    • ClipboardTests.png
    • DropDownButtonPage.png-dark
    • DropDownButtonPage.png
    • ImageIconPage.png-dark
    • ImageIconPage.png
    • Contacts_Pick.png-dark
    • Contacts_Pick.png
    • Image_UseTargetSizeLate.png
    • Buttons.png-dark
    • Basics Pivot Test.png-dark
    • ElementLevelTheme.png-dark
    • ElementLevelTheme.png
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • Focus_FocusVisual_Properties.png-dark
    • Image_Placeholder.png

@unodevops

Copy link
Copy Markdown
Contributor

⚠️⚠️ The build 226941 has failed on Uno.UI - CI.

MartinZikmund and others added 3 commits August 13, 2026 16:26
Minimise the public surface of the folded DependencyObject. Uno.UI grants
InternalsVisibleTo to the unit/runtime test assemblies and to Toolkit and
HotDesign, so in-repo usage does not force a member to stay public; the
only hard constraint is what the XAML source generator emits into the
CONSUMING assembly.

Demoted to internal (all Uno-only, all undocumented, none emitted by any
source generator):
- SetBinding(object, string, BindingBase) - zero consumers repo-wide.
- SetBindingValue(object, string) - only a unit test.
- GetBindingExpression(DependencyProperty) - absent from WinUI; every
  consumer is an InternalsVisibleTo test assembly.
- SuspendBindings() / ResumeBindings() - only a unit test; the real work
  is already internal on DependencyPropertyDetailsCollection.

Removed:
- IsStoreInitialized - had become a constant `true` with no consumer.

Kept public: the DependencyProperty and string SetBinding overloads,
which XamlFileGenerator emits (lines 4216 and 4231) for dependency
properties and for the x:Bind/POCO path respectively.

The four demoted members now carry their proper nullable annotations
instead of the oblivious wrappers added earlier in this branch -
obliviousness only matters for public surface.

Recorded explicitly in PackageDiffIgnore rather than leaning on the
Phase 1 declaring-type wildcards, which already match these names on any
type and would have absorbed the demotion silently.

Builds clean: Uno.UI, Uno.UI.UnitTests, Uno.UI.RuntimeTests.Skia and
SamplesApp.Skia.Generic on net10.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RrLpnAZeR1wBYdzwcqTPtP
The two surviving Uno-only public members on DependencyObject have to
stay public because XamlFileGenerator emits calls to them into the
consuming assembly, but they are not part of the WinUI contract and
should not surface in IntelliSense next to the WinUI members.

Mark them [EditorBrowsable(EditorBrowsableState.Never)], matching how
TemplatedParent/TemplatedParentProperty are already treated on this type
and the convention used across Uno.UI. Purely an IDE hint - no binary or
source compatibility impact.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RrLpnAZeR1wBYdzwcqTPtP
Uno.UI builds Skia-only, so UNO_HAS_ENHANCED_LIFECYCLE is always defined
and the #else branches were unreachable. Collapse them to the `new` form.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BVw9wuGbLBzDF5vp3nZHAd
@github-actions

github-actions Bot commented Aug 13, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @MartinZikmund's task in 2m 55s —— View job


PR Review: Remove DependencyObjectStore

  • Load review tools
  • Check new commits since last review pass (87eafee3 — chore: Drop dead lifecycle guards)
  • Verify DependencyObject.Store.cs:19 stale using directive (outstanding from all previous passes)
  • Applied local fix for stale using — commit 57c367c6 prepared, push denied (bot lacks write permission)
  • Review new changes for correctness
  • Post review summary

Verdict: ship — one cosmetic cleanup that I've committed locally but cannot push. Everything else is clean.

What was verified in this pass

New commit 87eafee3 (chore: Drop dead lifecycle guards on hiding members) correctly:

  • Collapsed all 8 #if UNO_HAS_ENHANCED_LIFECYCLE / #else blocks to the unconditional new form: StateTrigger.IsActive, ProgressRing.IsActive, Legacy/ProgressRing.IsActive, FlyoutBase.Enter, FlyoutBase.Leave, KeyboardAccelerator.EnterImpl, KeyboardAcceleratorCollection.Enter, KeyboardAcceleratorCollection.Leave
  • Applied grammar fix in ResourceDictionary.alc.cs ("an DependencyObject" → "a DependencyObject")
  • Added clarifying comment in ResourceDictionary.cs:835 explaining that the (DependencyObject) cast is intentional — it binds to the base notification, not the shadowing ResourceDictionary.NotifyThemeChanged, preserving the pre-fold behavior

Timeline.cs / ce05d590 — GC.SuppressFinalize(this) correctly replaced with a _disposed flag. Suppressing finalization would have also skipped ~DependencyObject, leaving binder state and pooled weak references unreleased. The flag skips only the dispatcher round-trip on the teardown path — the finalizer still runs and chains to the base.

PackageDiffIgnore.xml / 1d975d74 — regex patterns tightened to anchored matches (^Microsoft\.UI\.Xaml\.DependencyObjectStore$ etc.) so a future accidentally-public type whose name starts with DependencyObjectStore wouldn't be silently swallowed.

4eab3fa9 (fix: Restore oblivious signatures) — GetBindingExpression and the three SetBinding / SetBindingValue wrappers are correctly placed in the nullable-oblivious DependencyObject.cs partial, matching the historical interface-era signatures.

No event Action/event Action<T>, no async void without try/catch, no .Result/.GetAwaiter().GetResult() added in this diff.

One outstanding fix (cannot be pushed by bot)

src/Uno.UI/UI/Xaml/DependencyObject.Store.cs line 19 still carries:

using Windows.ApplicationModel.Calls;

This namespace is not referenced anywhere in the file — stale since the rename from DependencyObjectStore.Store.cs. I committed the fix locally as 57c367c6 but the push was denied (GitHub Actions bot lacks write permission to this repository). Please apply manually:

sed -i '/^using Windows\.ApplicationModel\.Calls;$/d' src/Uno.UI/UI/Xaml/DependencyObject.Store.cs
git add src/Uno.UI/UI/Xaml/DependencyObject.Store.cs
git commit -m "chore: Remove stale using Windows.ApplicationModel.Calls in DependencyObject.Store.cs"
Severity Count Notes
Low 1 Stale using Windows.ApplicationModel.Calls; in DependencyObject.Store.cs:19 — fix committed locally, push denied, must be applied manually

@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your WebAssembly Skia Sample App stage site is ready! Visit it here: https://unowasmprstaging.z20.web.core.windows.net/pr-23702/wasm-skia-net9/index.html

@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your Docs stage site is ready! Visit it here: https://unodocsprstaging.z13.web.core.windows.net/pr-23702/docs/index.html

Dropping `.Store` from the fluent chain left a whitespace-only line,
which trips IDE0055 under CI code-style enforcement.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BVw9wuGbLBzDF5vp3nZHAd
@github-actions

github-actions Bot commented Aug 13, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @MartinZikmund's task in 1m 26s —— View job


PR Review: Remove DependencyObjectStore

  • Load review tools
  • Analyze new commit b1e39a68 vs origin/feature/breakingchanges
  • Check stale using Windows.ApplicationModel.Calls; — still present, applied local fix (push denied)
  • Post review summary

Verdict: ship — one cosmetic cleanup still unresolved; all prior findings addressed.

New commit b1e39a68 — correct

style: Fix formatting left by the .Store call rewrite removes a whitespace-only line at DependencyObject.Store.cs:1495 that IDE0055 would flag under CI code-style enforcement. The change is minimal and correct.

One outstanding finding (unchanged across all seven review passes)

src/Uno.UI/UI/Xaml/DependencyObject.Store.cs line 19 still carries:

using Windows.ApplicationModel.Calls;

This namespace is not referenced anywhere in the file — stale since the rename from DependencyObjectStore.Store.cs. I committed the fix locally (chore: Remove stale using Windows.ApplicationModel.Calls in DependencyObject.Store.cs) but the push was again denied (GitHub Actions bot lacks write permission to this repository).

Please apply manually:

sed -i '/^using Windows\.ApplicationModel\.Calls;$/d' src/Uno.UI/UI/Xaml/DependencyObject.Store.cs
git add src/Uno.UI/UI/Xaml/DependencyObject.Store.cs
git commit -m "chore: Remove stale using Windows.ApplicationModel.Calls in DependencyObject.Store.cs"
Severity Count Notes
Low 1 Stale using Windows.ApplicationModel.Calls; in DependencyObject.Store.cs:19 — fix committed locally, push denied, must be applied manually

@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your WebAssembly Skia Sample App stage site is ready! Visit it here: https://unowasmprstaging.z20.web.core.windows.net/pr-23702/wasm-skia-net9/index.html

@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your Docs stage site is ready! Visit it here: https://unodocsprstaging.z13.web.core.windows.net/pr-23702/docs/index.html

@nventive-devops

Copy link
Copy Markdown
Contributor

The build 227470 found UI Test snapshots differences: skia-linux-screenshots: 83, skia-windows-screenshots: 132

Details
  • skia-linux-screenshots: 83 changed over 2366

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • Focus_FocusVisual_Properties.png-dark
    • Focus_FocusVisual_Properties.png
    • Attributed_text_FontSize_Changing.png
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • ColorPickerSample.png
    • DoubleImageBrushInList.png-dark
    • DoubleImageBrushInList.png
    • ImageBrushInList.png-dark
    • ImageBrushInList.png
    • ImageBrushLocalAsset.png
    • Gamepad_CurrentReading.png-dark
    • Gamepad_Enumeration.png-dark
    • Gamepad_Enumeration.png
    • ImageBrushAlignmentXY.png-dark
    • DynamicFont.png
    • ClipboardTests.png-dark
    • ClipboardTests.png
  • skia-windows-screenshots: 132 changed over 2366

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • ContextRequested.png-dark
    • Examples.png
    • Focus_FocusVisual_Properties.png-dark
    • Focus_FocusVisual_Properties.png
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • ContentPresenter_Template.png-dark
    • ContentPresenter_Template.png
    • EllipsemaskingEllipseGrid.png-dark
    • EllipsemaskingEllipseGrid.png
    • DropDownButtonPage.png-dark
    • DropDownButtonPage.png
    • ImageIconPage.png-dark
    • Image_UseTargetSizeLate.png-dark
    • ImageIconPage.png
    • Image_With_RotateTransform.png-dark
    • Buttons.png-dark
    • Buttons.png
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png

@unodevops

Copy link
Copy Markdown
Contributor

⚠️⚠️ The build 227470 has failed on Uno.UI - CI.

The android head built with UnoFeaturesOverride crashes ILLink with a stack
overflow in MarkStep.MarkBaseMethods, failing Templates Windows Tests 1 and
Templates macOS Tests 1. The plain android head still links fine.

Uno.Toolkit.WinUI, Uno.Toolkit.Skia.WinUI and Uno.Extensions.Reactive.UI ship
android assemblies compiled when DependencyObject was an interface, so six of
their types (Shadow, ResponsiveLayout, ViewDebugger, NavigationBarTemplateSettings,
TabBarTemplateSettings, TabBarSelectionIndicatorPresenterTemplateSettings) derive
from Object while listing Microsoft.UI.Xaml.DependencyObject in their interface
list. ILLink therefore walks that class's virtuals as interface methods to satisfy.

Folding the store in gives DependencyObject a finalizer, which it did not have
before. Those types declare none, so ILLink matches Object.Finalize up their base
chain and records DependencyObject.Finalize as its base - the reverse edge already
exists, and MarkBaseMethods keeps no visited set, so it recurses until the stack
overflows.

Not fixable from Uno.UI: an InterfaceImpl pointing at a class is invalid metadata,
so those types cannot load on 7.0 at all. The latest published Toolkit
(9.2.0-dev.15) and Extensions (7.4.0-dev.7) still carry the pattern, so the entry
stays disabled until they are rebuilt against Uno 7.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AUZ9SXCh5PNKAJeo8oKaeT
@github-actions

github-actions Bot commented Aug 14, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @MartinZikmund's task in 1m 43s —— View job


PR Review: Remove DependencyObjectStore

  • Load review tools
  • Check new commits since last review pass (b2abcdc3, b1e39a68)
  • Apply fix for stale using Windows.ApplicationModel.Calls; — committed locally as 9b322e64, push denied
  • Post review summary

Verdict: ship — one outstanding cosmetic fix that I cannot push (same permissions constraint as all prior passes).

New commits verified

b2abcdc3 (test: Disable android template with SDK features) — correct and well-documented. The commit message precisely explains the root cause: Uno.Toolkit and Uno.Extensions ship android assemblies compiled when DependencyObject was an interface. Those types list it in their interface list while deriving from Object. Now that DependencyObject carries a finalizer (from folding the store), ILLink walks it as a virtual to satisfy, maps DependencyObject.Finalize as a base of Object.Finalize, and recurses into a stack overflow — the MarkBaseMethods pass has no visited set. The affected assemblies cannot load on 7.0 regardless; disabling the test and adding the explanatory comment is the correct response until Toolkit/Extensions are rebuilt against 7.0.

b1e39a68 (style: Fix formatting left by the .Store call rewrite) — already verified in the August 13 pass; no new concerns.

One outstanding fix (push denied)

src/Uno.UI/UI/Xaml/DependencyObject.Store.cs line 19 still carries using Windows.ApplicationModel.Calls; — stale since the git mv from DependencyObjectStore.Store.cs. Applied and committed locally as 9b322e64 (chore: Remove stale using Windows.ApplicationModel.Calls in DependencyObject.Store.cs), but the push was denied — the GitHub Actions bot lacks write permission to this repository.

Please apply manually:

sed -i '/^using Windows\.ApplicationModel\.Calls;$/d' src/Uno.UI/UI/Xaml/DependencyObject.Store.cs
git add src/Uno.UI/UI/Xaml/DependencyObject.Store.cs
git commit -m "chore: Remove stale using Windows.ApplicationModel.Calls in DependencyObject.Store.cs"
Severity Count Notes
Low 1 Stale using Windows.ApplicationModel.Calls; in DependencyObject.Store.cs:19 — fix committed locally, push denied

@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your WebAssembly Skia Sample App stage site is ready! Visit it here: https://unowasmprstaging.z20.web.core.windows.net/pr-23702/wasm-skia-net9/index.html

@unodevops

Copy link
Copy Markdown
Contributor

🤖 Your Docs stage site is ready! Visit it here: https://unodocsprstaging.z13.web.core.windows.net/pr-23702/docs/index.html

@nventive-devops

Copy link
Copy Markdown
Contributor

The build 227676 found UI Test snapshots differences: skia-linux-screenshots: 73, skia-windows-screenshots: 120

Details
  • skia-linux-screenshots: 73 changed over 2366

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • Focus_FocusVisual_Properties.png-dark
    • Buttons.png
    • CalendarView_Theming.png-dark
    • Image_Margin_Large.png
    • Attributed_text_FontSize_Changing.png
    • ButtonClippingTestsControl.png-dark
    • ButtonClippingTestsControl.png
    • ClipboardTests.png-dark
    • ClipboardTests.png
    • DisplayInformation.png-dark
    • DisplayInformation.png
    • Gamepad_CurrentReading.png-dark
    • Gamepad_CurrentReading.png
    • Gamepad_Enumeration.png-dark
    • ImageBrush_Stretch.png
    • ImageBrushInList.png-dark
    • ImageBrushInList.png
    • ImageIconPage.png-dark
    • ImageIconPage.png
    • ExpanderColorValidationPage.png-dark
  • skia-windows-screenshots: 120 changed over 2366

    🚨🚨 Comparison Details (first 20) 🚨🚨
    • ButtonClippingTestsControl.png
    • Buttons.png-dark
    • EllipsemaskingEllipseGrid.png-dark
    • Focus_FocusVisual_Properties.png-dark
    • Contacts_Pick.png-dark
    • Contacts_Pick.png
    • Gamepad_CurrentReading.png-dark
    • Gamepad_Enumeration.png-dark
    • ButtonClippingTestsControl.png-dark
    • CalendarView_Theming.png-dark
    • CalendarView_Theming.png
    • ClipboardTests.png-dark
    • DropDownButtonPage.png-dark
    • DropDownButtonPage.png
    • Examples.png
    • ImageIconPage.png-dark
    • ImageIconPage.png
    • ImageBrushInList.png-dark
    • ImageBrushInList.png
    • ImageBrushLocalAsset.png-dark

@MartinZikmund
MartinZikmund merged commit 7c55431 into feature/breakingchanges Aug 14, 2026
67 checks passed
@MartinZikmund
MartinZikmund deleted the dev/mazi/dostore branch August 14, 2026 12:07
MartinZikmund added a commit that referenced this pull request Sep 2, 2026
BC26 shipped (uno#23537, #23702) and phase 2 dropped `DependencyObjectStore`
outright (uno-private#2210), but the paper trail still described the old design:
the impact spec asserted `DependencyObject` "is a public partial interface" and
left its open decisions unresolved, the rollup row was unticked, and four agent-
instruction files plus the migration guide still taught the interface model.

Reconciles the impact spec with what shipped (class on every target, generator
deleted rather than trimmed, store folded onto `DependencyObject`), ticks the
rollup row, corrects `AGENTS.md`, `.claude/rules/dependency-properties.md` and
`.claude/agents/architect.md`, and documents the consumer-visible half in the
migration guide — the dropped `partial` requirement, and that a type can no longer
inherit another base and pick up `DependencyObject` alongside it.

Closes unoplatform/uno-private#2055

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011qRGTg54VDxAG7zjuEVdoA
MartinZikmund added a commit that referenced this pull request Sep 2, 2026
BC26 shipped (uno#23537, #23702) and phase 2 dropped `DependencyObjectStore`
outright (uno-private#2210), but the paper trail still described the old design:
the impact spec asserted `DependencyObject` "is a public partial interface" and
left its open decisions unresolved, the rollup row was unticked, and four agent-
instruction files plus the migration guide still taught the interface model.

Reconciles the impact spec with what shipped (class on every target, generator
deleted rather than trimmed, store folded onto `DependencyObject`), ticks the
rollup row, corrects `AGENTS.md`, `.claude/rules/dependency-properties.md` and
`.claude/agents/architect.md`, and documents the consumer-visible half in the
migration guide — the dropped `partial` requirement, and that a type can no longer
inherit another base and pick up `DependencyObject` alongside it.

Closes unoplatform/uno-private#2055

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011qRGTg54VDxAG7zjuEVdoA
MartinZikmund added a commit that referenced this pull request Sep 10, 2026
BC26 shipped (uno#23537, #23702) and phase 2 dropped `DependencyObjectStore`
outright (uno-private#2210), but the paper trail still described the old design:
the impact spec asserted `DependencyObject` "is a public partial interface" and
left its open decisions unresolved, the rollup row was unticked, and four agent-
instruction files plus the migration guide still taught the interface model.

Reconciles the impact spec with what shipped (class on every target, generator
deleted rather than trimmed, store folded onto `DependencyObject`), ticks the
rollup row, corrects `AGENTS.md`, `.claude/rules/dependency-properties.md` and
`.claude/agents/architect.md`, and documents the consumer-visible half in the
migration guide — the dropped `partial` requirement, and that a type can no longer
inherit another base and pick up `DependencyObject` alongside it.

Closes unoplatform/uno-private#2055

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011qRGTg54VDxAG7zjuEVdoA
MartinZikmund added a commit that referenced this pull request Sep 15, 2026
BC26 shipped (uno#23537, #23702) and phase 2 dropped `DependencyObjectStore`
outright (uno-private#2210), but the paper trail still described the old design:
the impact spec asserted `DependencyObject` "is a public partial interface" and
left its open decisions unresolved, the rollup row was unticked, and four agent-
instruction files plus the migration guide still taught the interface model.

Reconciles the impact spec with what shipped (class on every target, generator
deleted rather than trimmed, store folded onto `DependencyObject`), ticks the
rollup row, corrects `AGENTS.md`, `.claude/rules/dependency-properties.md` and
`.claude/agents/architect.md`, and documents the consumer-visible half in the
migration guide — the dropped `partial` requirement, and that a type can no longer
inherit another base and pick up `DependencyObject` alongside it.

Closes unoplatform/uno-private#2055

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011qRGTg54VDxAG7zjuEVdoA
MartinZikmund added a commit that referenced this pull request Sep 16, 2026
BC26 shipped (uno#23537, #23702) and phase 2 dropped `DependencyObjectStore`
outright (uno-private#2210), but the paper trail still described the old design:
the impact spec asserted `DependencyObject` "is a public partial interface" and
left its open decisions unresolved, the rollup row was unticked, and four agent-
instruction files plus the migration guide still taught the interface model.

Reconciles the impact spec with what shipped (class on every target, generator
deleted rather than trimmed, store folded onto `DependencyObject`), ticks the
rollup row, corrects `AGENTS.md`, `.claude/rules/dependency-properties.md` and
`.claude/agents/architect.md`, and documents the consumer-visible half in the
migration guide — the dropped `partial` requirement, and that a type can no longer
inherit another base and pick up `DependencyObject` alongside it.

Closes unoplatform/uno-private#2055

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011qRGTg54VDxAG7zjuEVdoA
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/automation Categorizes an issue or PR as relevant to project automation area/build Categorizes an issue or PR as relevant to build infrastructure area/skia ✏️ Categorizes an issue or PR as relevant to Skia kind/documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants