Property
| Name |
|---|
| Modules |
| LogoAsset |
| RevealTargets |
| Playback |
Events
| Name |
|---|
| ModuleInvoked |
Example
IMPORTANT
You don’t need all of WelcomeHeroPage, WelcomeHeroPage2, and WelcomeHeroPage3. They’re just examples showing how you can display it the first time and then navigate back to the page.
Add a WelcomeHeroPage.xaml
xml
<Frame x:Name="MainFrame" />cs
public sealed partial class WelcomeHeroPage : Page
{
internal static WelcomeHeroPage Instance { get; private set; }
public static bool WelcomeIntroPlayed { get; set; }
public WelcomeHeroPage()
{
WelcomeIntroPlayed = false;
InitializeComponent();
Instance = this;
MainFrame.Navigate(typeof(WelcomeHeroPage2));
}
public void NavigateToModule(string moduleTag)
{
MainFrame.Navigate(typeof(WelcomeHeroPage3), moduleTag);
}
}and a WelcomeHeroPage2.xaml
xml
<Grid Style="{StaticResource PageStyle}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<dev:WelcomeHero x:Name="Hero" ModuleInvoked="Hero_ModuleInvoked" />
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<Grid Margin="32,0,32,24">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel VerticalAlignment="Top" Orientation="Vertical" Spacing="12">
<TextBlock x:Name="WelcomeTitle" HorizontalAlignment="Center" AutomationProperties.HeadingLevel="Level1" Style="{StaticResource TitleTextBlockStyle}" Text="Welcome to DevWinUI" />
<TextBlock x:Name="WelcomeDescription" HorizontalAlignment="Center" Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="DevWinUI is a collection of useful classes, controls, styles, and codes for WinUI 3." TextAlignment="Center" TextWrapping="Wrap" />
<StackPanel x:Name="WelcomeActions" Margin="0,24,0,48" HorizontalAlignment="Center" Orientation="Horizontal" Spacing="16">
<Button VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" Spacing="8">
<FontIcon FontSize="14" Glyph="" />
<TextBlock Grid.Row="1" Margin="0,-1,0,0" HorizontalAlignment="Center" Text="Configure DevWinUI" />
</StackPanel>
</Button>
<HyperlinkButton VerticalAlignment="Center" NavigateUri="https://ghost1372.github.io/" Style="{StaticResource TextButtonStyle}">
<TextBlock Text="Documentation" TextWrapping="Wrap" />
</HyperlinkButton>
</StackPanel>
<dev:SettingsCard x:Name="DataDiagnosticsCard" Background="Transparent" Header="Send Diagnostic Data" HeaderIcon="{dev:FontIcon Glyph=}">
<dev:SettingsCard.Description>
<StackPanel Orientation="Vertical">
<TextBlock Style="{StaticResource SecondaryTextStyle}" Text="Helps us make DevWinUI faster, more stable, and better over time" TextWrapping="WrapWholeWords" />
<HyperlinkButton Margin="0,2,0,0" Content="Learn more" FontWeight="SemiBold" />
<HyperlinkButton Margin="0,2,0,0" Content="View more diagnostic data settings" FontWeight="SemiBold" />
</StackPanel>
</dev:SettingsCard.Description>
<ToggleSwitch />
</dev:SettingsCard>
</StackPanel>
</Grid>
</ScrollViewer>
</Grid>cs
public sealed partial class WelcomeHeroPage2 : Page
{
public static Action<string> NavigateToModuleCallback { get; set; }
private const string WelcomeAssetFolder = "ms-appx:///Assets/Modules/OOBE/Welcome/";
public WelcomeHeroPage2()
{
InitializeComponent();
NavigateToModuleCallback = NavigateToModule;
Hero.Playback = WelcomeHeroPage.WelcomeIntroPlayed ? WelcomeHeroPlayback.Settle : WelcomeHeroPlayback.Intro;
WelcomeHeroPage.WelcomeIntroPlayed = true;
Hero.LogoAsset = $"ms-appx:///Assets/AppIcon.png";
Hero.Modules =
[
new($"{WelcomeAssetFolder}CommandPalette.png", "CmdPal", "Command Palette"),
new($"{WelcomeAssetFolder}AdvancedPaste.png", "AdvancedPaste", "Advanced Paste"),
new($"{WelcomeAssetFolder}FancyZones.png", "FancyZones", "FancyZones"),
new($"{WelcomeAssetFolder}ColorPicker.png", "ColorPicker", "Color Picker"),
new($"{WelcomeAssetFolder}PowerRename.png", "PowerRename", "PowerRename"),
new($"{WelcomeAssetFolder}Peek.png", "Peek", "Peek"),
new($"{WelcomeAssetFolder}Workspaces.png", "Workspaces", "Workspaces"),
new($"{WelcomeAssetFolder}LightSwitch.png", "LightSwitch", "Light Switch"),
new($"{WelcomeAssetFolder}TextExtractor.png", "TextExtractor", "Text Extractor"),
new($"{WelcomeAssetFolder}ZoomIt.png", "ZoomIt", "ZoomIt"),
new($"{WelcomeAssetFolder}KeyboardManager.png", "KBM", "Keyboard Manager"),
new($"{WelcomeAssetFolder}EnvironmentVariables.png", "EnvironmentVariables", "Environment Variables"),
new($"{WelcomeAssetFolder}ImageResizer.png", "ImageResizer", "Image Resizer"),
new($"{WelcomeAssetFolder}AlwaysOnTop.png", "AlwaysOnTop", "Always on Top"),
new($"{WelcomeAssetFolder}FileLocksmith.png", "FileLocksmith", "File Locksmith"),
new($"{WelcomeAssetFolder}NewPlus.png", "NewPlus", "New+"),
new($"{WelcomeAssetFolder}PowerDisplay.png", "PowerDisplay", "Power Display"),
new($"{WelcomeAssetFolder}MouseWithoutBorders.png", "MouseWithoutBorders", "Mouse Without Borders"),
new($"{WelcomeAssetFolder}Awake.png", "Awake", "Awake"),
new($"{WelcomeAssetFolder}CropAndLock.png", "CropAndLock", "Crop And Lock"),
new($"{WelcomeAssetFolder}ScreenRuler.png", "MeasureTool", "Screen Ruler"),
new($"{WelcomeAssetFolder}ShortcutGuide.png", "ShortcutGuide", "Shortcut Guide"),
new($"{WelcomeAssetFolder}QuickAccent.png", "QuickAccent", "Quick Accent"),
new($"{WelcomeAssetFolder}Hosts.png", "Hosts", "Hosts File Editor"),
new($"{WelcomeAssetFolder}RegistryPreview.png", "RegistryPreview", "Registry Preview"),
new($"{WelcomeAssetFolder}CommandNotFound.png", "CmdNotFound", "Command Not Found"),
new($"{WelcomeAssetFolder}FileExplorerPreview.png", "FileExplorer", "File Explorer Add-ons"),
new($"{WelcomeAssetFolder}PowerToysRun.png", "Run", "PowerToys Run"),
new($"{WelcomeAssetFolder}GrabAndMove.png", "GrabAndMove", "Grab And Move"),
new($"{WelcomeAssetFolder}FindMyMouse.png", "MouseUtils", "Find My Mouse"),
new($"{WelcomeAssetFolder}MouseJump.png", "MouseUtils", "Mouse Jump"),
new($"{WelcomeAssetFolder}MouseHighlighter.png", "MouseUtils", "Mouse Highlighter"),
new($"{WelcomeAssetFolder}MouseCrosshairs.png", "MouseUtils", "Mouse Crosshairs"),
new($"{WelcomeAssetFolder}CursorWrap.png", "MouseUtils", "Cursor Wrap"),
new($"{WelcomeAssetFolder}WindowingAndLayouts.png", "WindowingAndLayouts", "Windowing & Layouts"),
new($"{WelcomeAssetFolder}SystemTools.png", "SystemTools", "System Tools"),
new($"{WelcomeAssetFolder}SemanticKernel.png", "SemanticKernel", "Semantic Kernel"),
new($"{WelcomeAssetFolder}MouseUtils.png", "MouseUtils", "Mouse Utilities"),
new($"{WelcomeAssetFolder}InputOutput.png", "InputOutput", "Input / Output"),
new($"{WelcomeAssetFolder}FileManagement.png", "FileManagement", "File Management"),
new($"{WelcomeAssetFolder}Advanced.png", "Advanced", "Advanced"),
];
Hero.RevealTargets.Add(WelcomeTitle);
Hero.RevealTargets.Add(WelcomeDescription);
Hero.RevealTargets.Add(WelcomeActions);
Hero.RevealTargets.Add(DataDiagnosticsCard);
}
private void Hero_ModuleInvoked(object sender, string navigationTag)
{
NavigateToModuleCallback?.Invoke(navigationTag);
}
private void NavigateToModule(string tag)
{
// Simulates opening a module's settings page. Navigating back to BlankPage1
// re-constructs it, and since WelcomeIntroPlayed is now true it plays the
// short "Settle" animation instead of the full "Intro" again.
WelcomeHeroPage.Instance.NavigateToModule(tag);
}
}and a WelcomeHeroPage3.xaml
xml
<Grid Padding="20" Style="{StaticResource PageStyle}">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="16">
<!--
This simulates a module's settings page. Navigating here and back to
BlankPage1 (Welcome) demonstrates that the hero only plays its full
"Intro" animation once per app window: the second time BlankPage1 is
constructed, WelcomeHeroPlayback.Settle is used instead.
-->
<TextBlock x:Name="ModuleTitleText" HorizontalAlignment="Center" Style="{StaticResource TitleTextBlockStyle}" />
<TextBlock HorizontalAlignment="Center" Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="This is a stand-in for a module's settings page." />
<Button HorizontalAlignment="Center" Click="BackButton_Click" Content="Back to Welcome" />
</StackPanel>
</Grid>cs
public sealed partial class WelcomeHeroPage3 : Page
{
public WelcomeHeroPage3()
{
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var navigationTag = e.Parameter as string;
ModuleTitleText.Text = string.IsNullOrEmpty(navigationTag) ? "Module" : navigationTag;
}
private void BackButton_Click(object sender, RoutedEventArgs e)
{
if (Frame.CanGoBack)
{
Frame.GoBack();
}
}
}
Demo
you can run demo and see this feature.