Page 1 of 1

Unity adoption of Noesis

Posted: 27 Jun 2026, 09:35
by Yolkin Games
Hey,

I am developing with Noesis for almost 4 months now. Through this time i've accumulated war history of adopting it, which I thought might be useful for you to glance over. First, I've reported a few issues that look like genuine problems. However, reports 1, 2, 3 fix probably all collapse to one feature request: a single, package-wide "is the native library present/initialized?" check that every entry point consults, disabling cleanly instead of throwing.

Second, I wanted to share adoption gotchas I've been through - you might find it interesting. Obviously, some or even all of it might come from my lack of experience, solely, and is not a problem at all, but I thought you might want to know :)

Binding & data
  • {Binding Foo} silently fails when Foo is a public field, not a property. Error: Can't solve PropertyPath: Type 'T' does not contain a property named 'Foo'. The path resolver reflects over CLR properties only and skips public fields. WPF tolerates fields in some path-resolution code; the C++ bridge does not — a host-specific divergence. Most likely to bite when exposing a reactive wrapper ({Binding X.Value} where X is a field). Fix: expose anything XAML-bound as a get-only property. The error message points at the wrong layer (says the property doesn't exist when the real issue is field-vs-property) — a one-line doc note would save the hunt.
  • Implicit DataTemplate type-match (DataType="{x:Type ...}") is unreliable inside a Popup/ToolTip tree. Tooltip/menu chrome renders, body is blank, no error, VM non-null. Resolving the template by explicit x:Key via StaticResource (ContentTemplate="{StaticResource …}") works; only the implicit type-match step fails across the popup boundary. Useful corollary I verified: {noesis:Loc} does resolve inside the same popup body (it reads an inheritable attached property, which propagates into popups like DataContext/FontSize do) — so the popup boundary breaks ResourceDictionary key lookup, not inheritable-DP propagation. The two get conflated easily.
  • RelativeSource AncestorType=ContentPresenter fails silently (3.2); AncestorType=Border works. Surfaced when sizing custom-templated TabControl content to its host. A silent no-op (rather than a resolution error) makes it hard to spot.
Resource resolution & templates
  • StaticResource cross-file resolution differs between Editor and built client. A StaticResource whose key lives in a sibling ResourceDictionary that isn't explicitly merged resolves in the Editor but throws StaticResource '...' not found in the built client. The Editor flat-merges sibling dictionaries early; the build parses each dictionary in isolation. This Editor-vs-build leniency gap is the biggest "works on my machine" trap in the stack — every cross-file resource reference must be validated in an actual build. A doc note (or an Editor strict-mode mimicking build resolution) would prevent a lot of late surprises.
  • A local element-scoped <X.Style> without BasedOn renders magenta. Wrapping a Theme-styled control in an inline <X.Style> (commonly just to add Style.Triggers) replaces the implicit Theme style wholesale — including its Template — and the missing template falls back to a magenta rectangle. Fix: always chain BasedOn="{StaticResource {x:Type X}}". WPF-consistent in principle, but the magenta-on-missing-template failure mode is easy to hit; the tell is "magenta appears exactly when a triggered element becomes visible, siblings of the same type render fine."
  • An ItemContainer ControlTemplate without a <ContentPresenter/> renders empty rows. Chrome shows, content doesn't. Easy to forget when fully restyling a ListBox item container.
  • Nested ListBox loses the outer selection highlight when the inner one is clicked. Focus moves inward, the outer item goes Selected -> SelectedUnfocused, and the default SelectedUnfocused visual state has an empty storyboard. Fix: give SelectedUnfocused the same storyboard as Selected at each nesting level. The empty default is the surprise.
  • ScrollViewer default control template clipped content under the scrollbar via Grid.ColumnSpan/RowSpan="2" on the ScrollContentPresenter (rightmost ~17px painted under the bar). Removing the spans restores stock WPF layout (the Auto column is reserved for the bar). Flagging in case the shipped default template still carries the spans.
Tooltips & popups
  • An armed tooltip show-timer caches IsEnabled, InitialShowDelay, and the ToolTip value at MouseEnter (arm time); later writes are ignored. So ToolTipService.IsEnabled="{Binding …}" (or any ToolTipService.Set*) flipped after hover-in but before the delay elapses does nothing — the tooltip still pops, e.g. mid-drag or over a just-opened ContextMenu. The only lever that works on an already-armed timer is collapsing the cached ToolTip element's own Visibility. Compounding it: ToolTipService exposes no events, and ToolTipOpening/ToolTipClosing don't bubble out of the popup tree, so the open can't be cleanly intercepted. (Related: calling SetToolTip(null) on an inline-declared ToolTip throws 'ToolTip' cannot have logical or visual parent — but that's WPF-consistent parse-time parenting.)
  • Native popups (ToolTip, ContextMenu) render at fixed pixel size under a root LayoutTransform scale — because a popup is a separate top-level visual tree the root transform can't reach (this matches WPF, so the non-scaling itself is expected). The gotcha worth sharing is the fix constraint: the popup's own compensating scale must use LayoutTransform, not RenderTransform — RenderTransform scales after rasterization and visibly blurs tooltip text at high DPI. Anyone scaling a whole UI for DPI hits the popup-doesn't-scale wall, then the blur trap, in sequence.
Cursors (Unity integration)
  • Custom cursors live in Noesis.settings.asset, not in XAML/code, and the slot list is the fixed WPF CursorType enum. Declaring Cursor="SizeAll" (or any type) whose settings slot has no texture assigned silently falls back to the OS arrow — SetCursor(null), no error. There is no Custom/filename branch, so a custom .cur name in XAML matches nothing; you must repurpose a built-in slot. Under-documented; the silent arrow fallback reads as "my cursor XAML is broken" when the slot is just empty.
  • UnityEngine.Cursor.SetCursor(null) from your own C# (for cursors driven by non-Noesis hover, e.g. 3D-world hover) shows the OS arrow, not your themed arrow. Noesis only re-applies its configured cursor when the hovered Noesis element changes; moving off a world object onto empty space isn't a Noesis-element change, so it never re-fires and the OS arrow sticks. You must cache and re-apply the themed arrow texture yourself. A note that "Noesis owns the cursor only while over Noesis elements; you own it elsewhere, and the two don't hand off automatically" would help anyone mixing Noesis UI with 3D/world hover cursors.
Lifecycle & layout timing
  • Loaded fires before the first measure/arrange, so ActualWidth/ActualHeight are still 0 inside a Loaded handler — IsLoaded == true and ActualWidth == 0 simultaneously. This diverges from WPF silently (WPF has layout done by Loaded). The layout pass runs later (in the view's LateUpdate/Update). Fix: read size in SizeChanged (self-unsubscribe on first non-zero), not Loaded.
  • A window shown by flipping Visibility never acquires keyboard/logical focus, so input that depends on a focused element tree (notably the first MouseDown starting a DragDrop.DoDragDrop modal loop) is routed to focus-acquisition instead, and "feels dead until you alt-tab away and back" (which re-focuses the view). Fix: explicitly claim focus on show — set the root Focusable = true (Grid/Border roots are non-focusable by default, so Focus() no-ops otherwise), then Focus(), deferring one retry to Loaded if not yet loaded. Worth sharing because the symptom ("drag works only after alt-tab") is baffling until you connect it to focus.
Studio (tooling)
  • Noesis Studio auto-generates its xmlns prefix from the project name, which collides with NoesisGUIExtensions if the project name starts with Noesis. Studio then renames the extensions namespace to noesis1, and DataType resolution + noesis:Loc markup break in some files. Fix: don't name the Studio project with a Noesis/noesis prefix. A reserved-prefix warning in Studio would prevent this.
  • Studio treats an inline <UserControl> (used purely as a resource-scoping wrapper) as an opaque component boundary and can't drill into the wrapped element's child templates in the Navigator. Using a .Resources block for key isolation instead keeps templates editable. Also: <Component> appears in Noesis samples but is Studio-only and doesn't exist in the Unity 3.2 runtime — copying it from a sample breaks the build.

Re: Unity adoption of Noesis

Posted: 29 Jun 2026, 13:29
by jsantos
Thank you for the time dedicated to collecting all these issues and writing the reports!

One quick note: it seems the text has been generated or parsed by AI. While the extra verbosity added by AI is theoretically meant to help, we often find it does the opposite, it makes it harder to mentally parse and takes us more time to pinpoint the exact issue compared to standard, human-written reports.

Let's go through them one by one:
  • {Binding Foo} silently fails when Foo is a public field, not a property
    We are not seeing that WPF accepts fields. Are you able to show us this in a repro project?
  • Implicit DataTemplate type-match (DataType="{x:Type ...}") is unreliable inside a Popup/ToolTip tree
    Please report this in our tracker and attach a repro.
  • RelativeSource AncestorType=ContentPresenter fails silently
    Please report this and attach a repro.
  • StaticResource cross-file resolution differs between Editor and built client
    The Editor mentioned here is Noesis Studio, right? We have an idea of what's happening, and the team is currently investigating this.
  • A local element-scoped <X.Style> without BasedOn renders magenta
  • An ItemContainer ControlTemplate without a <ContentPresenter/> renders empty rows
    nested ListBox loses the outer selection highlight when the inner one is clicked
  • An ItemContainer ControlTemplate without a renders empty rows
    ested ListBox loses the outer selection highlight when the inner one is clicked

    These points are by design, not bugs.
  • ScrollViewer default control template clipped content under the scrollbar
    Our default style does this by design.
  • An armed tooltip show-timer caches IsEnabled, InitialShowDelay, and the ToolTip value at MouseEnter (arm time); later writes are ignored
    Please report this and attach a repro.
  • Native popups (ToolTip, ContextMenu) render at fixed pixel size under a root LayoutTransform scale
    In Noesis 4.0, we added a new property (ToolTipService.ScaleReferenceElement) that can be used to select the element whose transform is applied to the tooltip. Could you give this a try?
  • UnityEngine.Cursor.SetCursor(null) from your own C#
    Please report this and attach a repro.
  • Loaded fires before the first measure/arrange, so ActualWidth/ActualHeight are still 0 inside a Loaded handler
    We are not observing this behavior. Could you please help us reproduce it with a small project?
  • A window shown by flipping Visibility never acquires keyboard/logical focus
    Please report this and attach a repro.
  • Noesis Studio auto-generates its xmlns prefix from the project name, which collides with NoesisGUIExtensions if the project name starts with Noesis
    We have reproduced this. Please report it so we can track the fix.
  • Studio treats an inline <UserControl> (used purely as a resource-scoping wrapper) as an opaque component boundary
    We have reproduced this as well. Please report it.
Finally, please note that Components will be deprecated. Please open a new thread about this so we can discuss the recommended solution

Re: Unity adoption of Noesis

Posted: 29 Jun 2026, 14:55
by Yolkin Games
Hi,

Thank you for the prompt reply! I apologise for including AI slop into my feedback, I imagine it must be quite annoying :) Unfortunately, I don't have a sufficient level of comprehension what my agents are doing with the view models anymore to describe it in my own words. But if circumstances allow - I will try assembling minimal repros for different cases. Hopefully I could be of help already at this stage, even if a little.

As for components - noted, I've carved them out completely now, basically the main limitation I face while not using them is inability to preview my UI in Noesis Studio, as there's too many nested elements reactive to specific controls in my interfaces.

Nevertheless, knowing you've decided to retire them, I am now hopeful it would allow to less obstacles towards the release of NoesisGUI 4. Seen that you've put Noesis Studio to Windows store too - great progress, much more convinient to keep it up to date, thank you :)

Re: Unity adoption of Noesis

Posted: 29 Jun 2026, 17:15
by jsantos
As for components - noted, I've carved them out completely now, basically the main limitation I face while not using them is inability to preview my UI in Noesis Studio, as there's too many nested elements reactive to specific controls in my interfaces.
Could you elaborate on why you're unable to preview your nested elements in Noesis Studio? Are they custom controls implemented in C#? If so, you'll need the version of Noesis Studio that's integrated with Unity. The current beta for that integration is a bit outdated, but a new version is coming very soon, with support for all platforms, not just Windows.

Re: Unity adoption of Noesis

Posted: 30 Jun 2026, 08:04
by Yolkin Games
Thanks! To clarify — these aren't custom controls. I'm not subclassing Control/UserControl or declaring DependencyProperties; my screens are built from standard Noesis controls (Button, ListBox, TabControl) styled in XAML, with one-line LoadComponent code-behinds and MVVM ViewModels.

The specific thing that fails to preview: any screen that selects content by CLR type — DataTemplate DataType="{x:Type local:SomeViewModel}". Those render empty in Studio, because Studio can't resolve my compiled Game.Client ViewModel types. Screens that route content by resource-key or a string DataTrigger preview perfectly. So it's a data-type resolution gap, not a custom-control one.

Two questions:

1. Will the upcoming Unity-integrated Studio load my game's managed assembly, so {x:Type}-based DataTemplate selection resolves against my real ViewModels in preview? That's the exact mechanism breaking for me.
2. I'm on the Noesis 3.2.13 Unity package while Studio runs on 4.0.13b — does that version gap matter for preview fidelity?


Also btw is there a chance you offer paid personal online sessions (2-3h) to go over the use cases and best practices of development with Noesis? I feel like this is such a niche area in GameDev (people would normally use uGUI in Unity I believe), that it brings me to 2 conclusions:

a. Perhaps there are some obvious gotchas I am missing in working with Noesis even after watching most of the online tutorials and reading the docs, and thats why my workflow is so inconvenient as of now (write xamls by hand, preview in Unity, or at best - author xamls in Noesis as standalone pages, and then integrate them into bigger views, where they aren't previewable

b. If I won't be able to make the whole thing convenient - the moment I hire the real UI artist to the game I am now making solo - first question will be "how do I work here?", and after my reply - "we need to switch to uGUI". I don't believe that finding UI artist experienced in WPF in gamedev will be in range of my budget for the role :)

Re: Unity adoption of Noesis

Posted: 01 Jul 2026, 01:05
by jsantos
Hello!

Unfortunately, you're in the middle of a complicated transition from Microsoft Blend to Noesis Studio. This migration has taken us more than three years, but we're finally approaching the finish line with the release of Noesis 4.0, which is expected in about two months.

I recommend waiting a little longer and being patient. A new Unity beta with Noesis Studio integration should be available in the coming days.

The main advantage of using Studio inside Unity is that all of your custom classes and C# implementations are directly available within Studio.

We don't offer paid one-on-one online sessions with the Indie license. However, please feel free to ask questions here on the forums. We encourage you to open a separate thread for each topic you'd like to discuss, as that makes it easier to provide detailed answers and helps other users find the information later.

If you'd like, we can start by discussing components.

Re: Unity adoption of Noesis

Posted: 01 Jul 2026, 09:06
by Yolkin Games
Thank you, Im in no rush today, my UI is functional both in lobby and battle, tooltips are working, drag&drop is there, state machines, animations, whole esc menu cascade and settings are built and functional, textboxes are not highjacking input, also text is readable and is not losing in quality with resolution changes, everything is auto scaling with a slider or resolution, inventory items in the game are read and fed from postgres via R3, together with all live player stats - it's great. The only part missing for me now in development process is actual visual authoring, and "wait 2 months (or even 6) to have it solved" is way better premise than what I could have hoped for when starting this conversation :)

I won't fill your time with usage questions until then, and will try to gather up repro projects for the things I trip upon.

Have a great summer!

UPD: just read your message more carefully and seen the "unity integration with Noesis in upcoming days". Wow. OK. Wow.

Re: Unity adoption of Noesis

Posted: 01 Jul 2026, 15:28
by jsantos
Studio integrated in Unity is already available in B13.

But I recommend waiting a bit, because that's version is a bit old and a new beta with all platforms is coming very soon.