Thanks for raising this. You've hit a real gap. GameCanvas doesn't currently have a Paint event or expose a Graphics object today: it's deliberately sprite/tile-based, with the engine managing all the rendering as GPU textures. Its events are Started, Updated, SpriteCollision, SpriteBoundaryCollision, KeyDown and KeyUp.
However...
I've logged a feature to add a Canvas-style Paint event to GameCanvas: each frame, after sprites and tile layers are drawn, your handler would receive a Graphics object and could draw text, shapes and pictures on top of the game - health bars, score readouts, dialogue over the scene, highlighting the sprite under the mouse. Exactly the sort of thing a text adventure with interactive graphics needs. It's accepted here: https://feedback.objo.dev/feature/1687 - a vote on that page helps me prioritise it.
Until then, three workarounds
1. Put the prose in a Label
The simplest split: place a Label (with Multiline = True) over or beside the GameCanvas for your text, and keep the world in the canvas as sprites. Update Label1.Text whenever the story state changes. The sprites stay interactive in the canvas; the text is just a normal control on the window.
2. Turn the text itself into a sprite
Render text into a Picture, save it as a PNG, and create a sprite from it:
Var pic As New Picture(600, 300)
Var g As Graphics = pic.Graphics
g.DrawingColour = Colour.White
g.FontSize = 18
g.DrawText("You are standing in a dark room.", 10, 10, 580)
Var png As String = SpecialFolder.Temporary.Child("story-text.png").Path
pic.Save(png)
Var storyText As Sprite = GameCanvas1.CreateSprite(png)
storyText.CollisionEnabled = False
Regenerate it when the text changes (not every frame): remove the old sprite, save a new PNG, create a new sprite. It then layers, moves and scales like any other sprite, and CollisionEnabled = False keeps it out of sprite-collision checks.
3. Use a plain Canvas instead
If you don't need GameCanvas's sprite physics (velocity, boundary bouncing, collision groups), a regular Canvas gives you the full Graphics object: g.DrawText for prose and g.DrawPicture for your images, with mouse events to detect clicks on your interactive pictures. You'd track which regions are interactive yourself. For a mostly text-driven game with a handful of interactive graphics, that's often the better fit today.