Skip to content
Welcome to our documentation!

SheetView

A sheet overlay that slides in from the bottom or top of the screen with configurable snap positions (detents), optional header peek when minimized, backdrop dimming, pan gestures, haptic feedback, and automatic keyboard handling.

  • NuGet downloads for Shiny.Maui.Controls
  • NuGet downloads for Shiny.Blazor.Controls
Frameworks
.NET MAUI
Blazor
ClosedOpenHeader (Minimized)Header (Open)Top (Minimized)Top (Open)
ClosedOpenHeader MinimizedHeader OpenTop MinimizedTop Open
<shiny:SheetView IsOpen="{Binding IsSheetOpen, Mode=TwoWay}">
<VerticalStackLayout Padding="20" Spacing="10">
<Label Text="Sheet Content" FontSize="18" FontAttributes="Bold" />
<Label Text="Drag the handle or tap the backdrop to close." />
<Button Text="Close" Command="{Binding CloseSheetCommand}" />
</VerticalStackLayout>
</shiny:SheetView>
<ContentPage>
<Grid>
<!-- Main page content -->
<ScrollView>
<VerticalStackLayout>
<Button Text="Open Sheet" Command="{Binding OpenCommand}" />
</VerticalStackLayout>
</ScrollView>
<!-- Sheet overlays on top -->
<shiny:SheetView IsOpen="{Binding IsOpen, Mode=TwoWay}">
<Label Text="Sheet content" />
</shiny:SheetView>
</Grid>
</ContentPage>
PropertyTypeDefaultDescription
IsOpenboolfalseShow/hide the sheet (TwoWay bindable)
SheetContentView?nullContent displayed in the sheet (ContentProperty)
DetentsObservableCollection<DetentValue>Quarter, Half, FullSnap positions as ratios of available height
SheetBackgroundColorColorWhiteBackground of the sheet panel
HandleColorColorGreyDrag handle indicator color
SheetCornerRadiusdouble16Top corner radius
HasBackdropbooltrueShow dimming backdrop behind the sheet
CloseOnBackdropTapbooltrueTap backdrop to close
AnimationDurationdouble250Animation speed in ms
ExpandOnInputFocusbooltrueAuto-expand when an input is focused
IsLockedboolfalsePrevents swipe, pan, and backdrop tap dismiss; sheet can only be controlled programmatically
FitContentboolfalseMeasures content and auto-computes a single detent to fit it
DirectionSheetDirectionBottomDirection the sheet slides from (Bottom or Top)
HeaderTemplateDataTemplate?nullCustom header template displayed above the sheet content
ShowHeaderWhenMinimizedboolfalseWhen true, shows the header as a peek strip when the sheet is closed
UseHapticFeedbackbooltrueHaptic click on open, close, and detent snap

Predefined snap points:

Static PropertyRatioDescription
DetentValue.Quarter0.2525% height
DetentValue.Half0.5050% height
DetentValue.ThreeQuarters0.7575% height
DetentValue.Full1.0Full height

Custom detent: new DetentValue(0.33) for 33%.

<shiny:SheetView IsOpen="{Binding IsOpen, Mode=TwoWay}"
SheetBackgroundColor="#1E1E1E"
HandleColor="#888888"
SheetCornerRadius="24">
<shiny:SheetView.Detents>
<shiny:DetentValue Ratio="0.33" />
<shiny:DetentValue Ratio="0.66" />
<shiny:DetentValue Ratio="1.0" />
</shiny:SheetView.Detents>
<VerticalStackLayout Padding="20">
<Label Text="Custom Sheet" TextColor="White" />
</VerticalStackLayout>
</shiny:SheetView>
EventArgsDescription
OpenedEventArgsSheet finished opening
ClosedEventArgsSheet finished closing
DetentChangedDetentValueSheet snapped to a different detent
  • Pan gesture — Drag up/down between detents; swipe past the lowest to close
  • Keyboard handling — Auto-expands when an Entry/Editor is focused, restores on dismiss
  • ScrollView integration — Scroll enabled only at the highest detent; disabled at lower detents for pan
  • Backdrop — Semi-transparent overlay that dims proportionally to sheet position
  • Locked mode — When IsLocked="True", the drag handle is hidden, pan gestures are disabled, and backdrop tap is ignored. The sheet can only be opened/closed via binding. Ideal for signature capture, selectors, or confirmation dialogs.
  • Fit content — When FitContent="True", the sheet measures its content and auto-computes a single detent to fit it, ignoring the Detents collection.
  • Top or bottom — Set Direction="Top" to slide in from the top of the screen instead of the bottom
  • Header peek — Provide a HeaderTemplate and set ShowHeaderWhenMinimized="True" to show the header as a strip when the sheet is closed, giving users a tap/drag target to reopen
  • Haptic feedback — Tactile click feedback on open, close, and detent snap (disable with UseHapticFeedback="False")
<shiny:SheetView IsOpen="{Binding IsNotificationOpen}"
Direction="Top"
FitContent="True"
SheetCornerRadius="0,0,16,16">
<VerticalStackLayout Padding="20" Spacing="10">
<Label Text="New Notification" FontAttributes="Bold" />
<Label Text="You have a new message." />
</VerticalStackLayout>
</shiny:SheetView>
<shiny:SheetView IsOpen="{Binding IsOpen}"
ShowHeaderWhenMinimized="True">
<shiny:SheetView.HeaderTemplate>
<DataTemplate>
<Label Text="Now Playing — Drag up for details"
Padding="16,8"
FontSize="14" />
</DataTemplate>
</shiny:SheetView.HeaderTemplate>
<VerticalStackLayout Padding="20">
<Label Text="Full player controls here" />
</VerticalStackLayout>
</shiny:SheetView>
<!-- Signature capture: locked + auto-sized -->
<shiny:SheetView IsOpen="{Binding IsSignatureOpen}"
IsLocked="True"
FitContent="True"
HasBackdrop="True"
SheetCornerRadius="20">
<VerticalStackLayout Padding="20" Spacing="15">
<Label Text="Draw your signature" FontSize="18" FontAttributes="Bold" />
<!-- signature content -->
<Button Text="Done" Command="{Binding DoneCommand}" />
</VerticalStackLayout>
</shiny:SheetView>
claude plugin marketplace add shinyorg/skills
claude plugin install shiny-controls@shiny
copilot plugin marketplace add https://github.com/shinyorg/skills
copilot plugin install shiny-controls@shiny
View shiny-controls Plugin