Primary APIs:
PopupFlyoutBase and PopupFlyoutBaseContextMenuToolTipOverlayPopupHostPlacementModePopupAnchor, PopupGravity, PopupPositionerConstraintAdjustmentCustomPopupPlacementCallbackImportant members:
Popup.IsOpen, Child, PlacementTarget, Placement, PlacementRectPopup.IsLightDismissEnabled, Topmost, ShouldUseOverlayLayer, IsUsingOverlayLayerPopup.OverlayDismissEventPassThrough, OverlayInputPassThroughElementPopup.Opened, Closed, ClosingFlyoutBase.ShowAt(...), Hide(), IsOpen, TargetFlyoutBase.AttachedFlyoutProperty, ShowAttachedFlyout(...)PopupFlyoutBase.ShowModeToolTip.TipProperty, IsOpenProperty, PlacementProperty, ShowDelayPropertyToolTip.ToolTipOpeningEvent, ToolTip.ToolTipClosingEventControl.ContextMenuProperty, Control.ContextFlyoutPropertyReference source files:
src/Avalonia.Controls/Primitives/Popup.cssrc/Avalonia.Controls/Flyouts/FlyoutBase.cssrc/Avalonia.Controls/Flyouts/PopupFlyoutBase.cssrc/Avalonia.Controls/ContextMenu.cssrc/Avalonia.Controls/ToolTip.cssrc/Avalonia.Controls/Primitives/OverlayPopupHost.cssrc/Avalonia.Controls/PlacementMode.cssrc/Avalonia.Controls/Primitives/PopupPositioning/IPopupPositioner.cssrc/Avalonia.Controls/Primitives/PopupPositioning/CustomPopupPlacementCallback.cssrc/Avalonia.Controls/Control.csCore decisions:
Bottom, Pointer) vs anchor/gravity mode.Constraint adjustment flags (Slide, Flip, Resize) control fallback behavior when popup would be out of bounds.
<Button Content="Actions">
<Button.ContextFlyout>
<Flyout Placement="Bottom">
<StackPanel Spacing="8" Margin="8">
<Button Content="Rename" Command="{Binding RenameCommand}" />
<Button Content="Delete" Command="{Binding DeleteCommand}" />
</StackPanel>
</Flyout>
</Button.ContextFlyout>
</Button>
<Popup x:Name="InspectorPopup"
IsOpen="{Binding IsInspectorOpen}"
PlacementTarget="{Binding #AnchorButton}"
Placement="AnchorAndGravity"
PlacementAnchor="BottomLeft"
PlacementGravity="BottomLeft"
IsLightDismissEnabled="True"
PlacementConstraintAdjustment="FlipX,FlipY,SlideX,SlideY" />
<TextBox ToolTip.Tip="Enter API token"
ToolTip.Placement="Top"
ToolTip.ShowDelay="250"
ToolTip.BetweenShowDelay="100" />
using Avalonia.Controls.Primitives.PopupPositioning;
popup.CustomPopupPlacementCallback = (popupSize, targetSize, offset) =>
{
return new[]
{
new CustomPopupPlacement(new Point(0, targetSize.Height + 4), PopupPrimaryAxis.Vertical)
};
};
ContextFlyout/ContextMenu for menu semantics over ad-hoc popups.PlacementMode.AnchorAndGravity when you need predictable cross-platform edge behavior.PlacementTarget or incorrect PlacementRect.OverlayDismissEventPassThrough or OverlayInputPassThroughElement.ToolTip.ServiceEnabled disabled or Tip unset.ToolTipOpeningEvent handler.Default mode:
XAML-first complete example:
<StackPanel xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Spacing="8">
<Button x:Name="AnchorButton" Content="Show Popup" Click="ShowPopupClick" />
<Popup x:Name="InspectorPopup"
PlacementTarget="{Binding #AnchorButton}"
Placement="Bottom"
IsLightDismissEnabled="True">
<Border Padding="8" Background="#2B2F36">
<TextBlock Text="Inspector" />
</Border>
</Popup>
</StackPanel>
Code-only alternative (on request):
using Avalonia;
using Avalonia.Controls;
using Avalonia.Media;
var popup = new Popup
{
PlacementTarget = anchorButton,
Placement = PlacementMode.Bottom,
IsLightDismissEnabled = true,
Child = new Border
{
Padding = new Thickness(8),
Background = Brushes.DimGray,
Child = new TextBlock { Text = "Inspector" }
}
};
anchorButton.Click += (_, _) => popup.IsOpen = true;