noesis_runtime 0.11.0

Rust bindings for the Noesis GUI Native SDK: load XAML UI, drive the view and renderer, and write custom controls in Rust. Renderer-agnostic; Bevy integration lives in noesis_bevy.
Documentation
# Noesis SDK limitations

A few things the Noesis 3.2.13 SDK can't do, or does differently from WPF. Each
one notes what to do instead, so you don't have to find out the hard way.

## Your app has to handle these

Noesis leaves these to the host platform, so there's no SDK call for them.

- **Clipboard.** No clipboard API. Hook the copy and paste events to catch the
  intent, then read or write the OS clipboard yourself (`arboard` works well on
  desktop).
- **Screenshots.** No built-in screenshot call. Render the view into a render
  target your device owns and read the pixels back from it.
- **Listing installed fonts.** The SDK enumerates the faces inside a given font,
  but not the set of installed families. Your font provider decides which
  families it serves, so ask it.
- **Fonts for text measurement.** Measuring text returns zero until a font
  provider (or a fallback) resolves the family to a real face. That's a setup
  step, not a bug.
- **Frame and CPU profiling.** The profiler macros do nothing unless the SDK was
  built against a third-party profiler. Time your own update and render calls.
  Per-frame render stats and the debug overlays (wireframe, overdraw, batch
  coloring) do work.

## Different from WPF

These work, just not the way WPF does it.

- **Custom `TypeConverter`s.** You can't register one to turn a string into a
  custom type during XAML load. The `convert_from_string` path and binding-side
  value converters do work.
- **Some dependency-property helpers are value-types only.** Base-value
  read-back, read-only setters, and value coercion handle value, struct, and
  string properties, but not object or brush ones (and coercion only covers a
  class's first 32 properties). Worth knowing if you write custom controls.
- **`FormattedText` is set up at construction.** Font, size, width, alignment,
  trimming, and the rest are constructor arguments, not setters. Changing one
  means rebuilding the layout.
- **SVG parsing gives you shapes, not an image.** `SVG.Parse` returns the overall
  size plus per-shape fill and stroke info you can inspect or feed into your own
  geometry. It isn't an image source you can hand to an `Image`. (`SVGPath`
  parse, bounds, and hit-testing are fully supported.)
- **Animation control runs through `Storyboard`.** Seek, speed, pause, resume,
  and stop live on storyboard actions, not on a standalone clock.
- **Templates are written in XAML, not built in code.** There's no factory for
  assembling a template's visual tree node by node. Parse it from XAML and assign
  it. Styles, data triggers, and selecting templates from Rust all work.
- **No dispatcher queue.** Schedule deferred or cross-thread work through the
  view's timer API instead.

## Not supported

The SDK doesn't allow these at all.

- **Custom `Brush`/`Geometry`/`Transform`/`Effect` subclasses.** These serialize
  into the GPU render tree, which a custom subclass can't drive. Custom
  `Freezable` subclasses (with their own dependency properties and freeze
  support) are fine.
- **Retained or recorded drawings.** There's no drawing object model and no
  drawing-as-a-brush. Immediate-mode drawing is reachable only by overriding a
  custom element's `OnRender`.