mirror of
https://github.com/PacktPublishing/Learn-WinUI-3-Second-Edition.git
synced 2026-06-20 12:23:09 +00:00
Add chapter 10 sample project
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
<Page
|
||||
x:Class="TemplateStudioSampleApp.Views.DataGridPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Grid x:Name="ContentArea">
|
||||
<controls:DataGrid
|
||||
AutoGenerateColumns="False"
|
||||
GridLinesVisibility="Horizontal"
|
||||
ItemsSource="{x:Bind ViewModel.Source, Mode=OneWay}">
|
||||
<controls:DataGrid.Resources>
|
||||
<SolidColorBrush x:Key="DataGridColumnHeaderBackgroundColor" Color="Transparent" />
|
||||
</controls:DataGrid.Resources>
|
||||
<controls:DataGrid.Columns>
|
||||
<!-- TODO: Replace column definitions to match real data. Consider adding Header values to Resources.resw. -->
|
||||
<controls:DataGridTextColumn Binding="{Binding OrderID}" Header="OrderID" />
|
||||
<controls:DataGridTextColumn Binding="{Binding OrderDate}" Header="OrderDate" />
|
||||
<controls:DataGridTextColumn Binding="{Binding Company}" Header="Company" />
|
||||
<controls:DataGridTextColumn Binding="{Binding ShipTo}" Header="ShipTo" />
|
||||
<controls:DataGridTextColumn Binding="{Binding OrderTotal}" Header="OrderTotal" />
|
||||
<controls:DataGridTextColumn Binding="{Binding Status}" Header="Status" />
|
||||
<controls:DataGridTemplateColumn Header="Symbol">
|
||||
<controls:DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<FontIcon
|
||||
HorizontalAlignment="Left"
|
||||
FontFamily="{ThemeResource SymbolThemeFontFamily}"
|
||||
Glyph="{Binding Symbol}"
|
||||
AutomationProperties.Name="{Binding SymbolName}" />
|
||||
</DataTemplate>
|
||||
</controls:DataGridTemplateColumn.CellTemplate>
|
||||
</controls:DataGridTemplateColumn>
|
||||
</controls:DataGrid.Columns>
|
||||
</controls:DataGrid>
|
||||
</Grid>
|
||||
</Page>
|
||||
@@ -0,0 +1,21 @@
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
|
||||
using TemplateStudioSampleApp.ViewModels;
|
||||
|
||||
namespace TemplateStudioSampleApp.Views;
|
||||
|
||||
// TODO: Change the grid as appropriate for your app. Adjust the column definitions on DataGridPage.xaml.
|
||||
// For more details, see the documentation at https://docs.microsoft.com/windows/communitytoolkit/controls/datagrid.
|
||||
public sealed partial class DataGridPage : Page
|
||||
{
|
||||
public DataGridViewModel ViewModel
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public DataGridPage()
|
||||
{
|
||||
ViewModel = App.GetService<DataGridViewModel>();
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<UserControl
|
||||
x:Class="TemplateStudioSampleApp.Views.ListDetailsDetailControl"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d">
|
||||
<ScrollViewer
|
||||
Name="ForegroundElement"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalScrollMode="Enabled"
|
||||
IsTabStop="True">
|
||||
<StackPanel HorizontalAlignment="Left">
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
|
||||
<FontIcon
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="48"
|
||||
Glyph="{x:Bind ListDetailsMenuItem.Symbol, Mode=OneWay}"
|
||||
AutomationProperties.Name="{x:Bind ListDetailsMenuItem.SymbolName, Mode=OneWay}" />
|
||||
<TextBlock
|
||||
Margin="{StaticResource SmallLeftMargin}"
|
||||
VerticalAlignment="Center"
|
||||
Text="{x:Bind ListDetailsMenuItem.Company, Mode=OneWay}"
|
||||
Style="{ThemeResource TitleTextBlockStyle}" />
|
||||
</StackPanel>
|
||||
<StackPanel Padding="0,15,0,0">
|
||||
<TextBlock Text="Status" Style="{StaticResource DetailSubTitleStyle}" />
|
||||
|
||||
<TextBlock Text="{x:Bind ListDetailsMenuItem.Status, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
|
||||
|
||||
<TextBlock
|
||||
Margin="{StaticResource SmallTopMargin}"
|
||||
Text="Order date"
|
||||
Style="{StaticResource DetailSubTitleStyle}" />
|
||||
<TextBlock Text="{x:Bind ListDetailsMenuItem.OrderDate, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
|
||||
<TextBlock
|
||||
Margin="{StaticResource SmallTopMargin}"
|
||||
Text="Company"
|
||||
Style="{StaticResource DetailSubTitleStyle}" />
|
||||
<TextBlock Text="{x:Bind ListDetailsMenuItem.Company, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
|
||||
|
||||
<TextBlock
|
||||
Margin="{StaticResource SmallTopMargin}"
|
||||
Text="Ship to"
|
||||
Style="{StaticResource DetailSubTitleStyle}" />
|
||||
<TextBlock Text="{x:Bind ListDetailsMenuItem.ShipTo, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
|
||||
<TextBlock
|
||||
Margin="{StaticResource SmallTopMargin}"
|
||||
Text="Order total"
|
||||
Style="{StaticResource DetailSubTitleStyle}" />
|
||||
<TextBlock Text="{x:Bind ListDetailsMenuItem.OrderTotal, Mode=OneWay}" Style="{StaticResource DetailBodyBaseMediumStyle}" />
|
||||
|
||||
<TextBlock
|
||||
Margin="{StaticResource MediumTopMargin}"
|
||||
Text="Note 1"
|
||||
Style="{StaticResource DetailSubTitleStyle}" />
|
||||
<TextBlock
|
||||
Style="{StaticResource DetailBodyStyle}"
|
||||
Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis quis hendrerit nulla, vel molestie libero. In nec ultricies magna, ultricies molestie ipsum. Mauris non dignissim velit. Etiam malesuada blandit mauris eu maximus. Quisque ornare, felis nec scelerisque mollis, risus dolor posuere magna, in gravida quam mi id nisi. Nullam mattis consequat ex. Cras nulla neque, dictum ac urna et, vestibulum feugiat ex. Pellentesque malesuada accumsan ligula, vel fringilla lacus facilisis sit amet. Proin convallis tempor arcu, ac placerat libero pretium ut. Praesent hendrerit nisl at lobortis viverra. Fusce vitae velit odio. Nam ut tortor sed purus finibus sollicitudin quis at ante. Ut sodales dolor vel eros mollis suscipit. Donec eu nulla id urna ultricies consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;" />
|
||||
|
||||
<TextBlock
|
||||
Margin="{StaticResource SmallTopMargin}"
|
||||
Text="Note 2"
|
||||
Style="{StaticResource DetailSubTitleStyle}" />
|
||||
<TextBlock
|
||||
Margin="{StaticResource MediumBottomMargin}"
|
||||
Style="{StaticResource DetailBodyStyle}"
|
||||
Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis quis hendrerit nulla, vel molestie libero. In nec ultricies magna, ultricies molestie ipsum. Mauris non dignissim velit. Etiam malesuada blandit mauris eu maximus. Quisque ornare, felis nec scelerisque mollis, risus dolor posuere magna, in gravida quam mi id nisi. Nullam mattis consequat ex. Cras nulla neque, dictum ac urna et, vestibulum feugiat ex. Pellentesque malesuada accumsan ligula, vel fringilla lacus facilisis sit amet. Proin convallis tempor arcu, ac placerat libero pretium ut. Praesent hendrerit nisl at lobortis viverra. Fusce vitae velit odio. Nam ut tortor sed purus finibus sollicitudin quis at ante. Ut sodales dolor vel eros mollis suscipit. Donec eu nulla id urna ultricies consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,30 @@
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
|
||||
using TemplateStudioSampleApp.Core.Models;
|
||||
|
||||
namespace TemplateStudioSampleApp.Views;
|
||||
|
||||
public sealed partial class ListDetailsDetailControl : UserControl
|
||||
{
|
||||
public SampleOrder? ListDetailsMenuItem
|
||||
{
|
||||
get => GetValue(ListDetailsMenuItemProperty) as SampleOrder;
|
||||
set => SetValue(ListDetailsMenuItemProperty, value);
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty ListDetailsMenuItemProperty = DependencyProperty.Register("ListDetailsMenuItem", typeof(SampleOrder), typeof(ListDetailsDetailControl), new PropertyMetadata(null, OnListDetailsMenuItemPropertyChanged));
|
||||
|
||||
public ListDetailsDetailControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private static void OnListDetailsMenuItemPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
if (d is ListDetailsDetailControl control)
|
||||
{
|
||||
control.ForegroundElement.ChangeView(0, 0, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
<Page
|
||||
x:Class="TemplateStudioSampleApp.Views.ListDetailsPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"
|
||||
xmlns:models="using:TemplateStudioSampleApp.Core.Models"
|
||||
xmlns:views="using:TemplateStudioSampleApp.Views"
|
||||
xmlns:behaviors="using:TemplateStudioSampleApp.Behaviors"
|
||||
behaviors:NavigationViewHeaderBehavior.HeaderMode="Never"
|
||||
mc:Ignorable="d">
|
||||
<Page.Resources>
|
||||
<DataTemplate x:Key="ItemTemplate" x:DataType="models:SampleOrder">
|
||||
<Grid Height="60">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<FontIcon
|
||||
Grid.Column="0"
|
||||
VerticalAlignment="Center"
|
||||
FontSize="32"
|
||||
Glyph="{x:Bind Symbol}"
|
||||
AutomationProperties.Name="{x:Bind SymbolName}" />
|
||||
<StackPanel
|
||||
Grid.Column="1"
|
||||
Margin="{StaticResource SmallLeftMargin}"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="{x:Bind Company}" Style="{StaticResource ListTitleStyle}" />
|
||||
<TextBlock Text="{x:Bind Status}" Style="{StaticResource ListSubTitleStyle}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
<DataTemplate x:Key="DetailsTemplate">
|
||||
<Grid>
|
||||
<views:ListDetailsDetailControl ListDetailsMenuItem="{Binding}" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
<DataTemplate x:Key="NoSelectionContentTemplate">
|
||||
<Grid>
|
||||
<TextBlock
|
||||
x:Uid="ListDetails_NoSelection"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
TextAlignment="Center"
|
||||
Style="{ThemeResource SubtitleTextBlockStyle}" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
<DataTemplate x:Key="ListHeaderTemplate">
|
||||
<Grid Height="40">
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ListTitleStyle}"
|
||||
Text="{Binding}" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
<DataTemplate x:Key="MinimalListHeaderTemplate">
|
||||
<Grid Height="40">
|
||||
<TextBlock
|
||||
Margin="96,0,0,0"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ListTitleStyle}"
|
||||
Text="{Binding}" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</Page.Resources>
|
||||
|
||||
<Grid x:Name="ContentArea">
|
||||
<VisualStateManager.VisualStateGroups>
|
||||
<VisualStateGroup>
|
||||
<VisualState>
|
||||
<VisualState.StateTriggers>
|
||||
<!--641 is the default CompactModeThresholdWidth in NavigationView -->
|
||||
<AdaptiveTrigger MinWindowWidth="641" />
|
||||
</VisualState.StateTriggers>
|
||||
<VisualState.Setters>
|
||||
<Setter Target="ListDetailsViewControl.ListHeaderTemplate" Value="{StaticResource ListHeaderTemplate}" />
|
||||
</VisualState.Setters>
|
||||
</VisualState>
|
||||
</VisualStateGroup>
|
||||
</VisualStateManager.VisualStateGroups>
|
||||
<controls:ListDetailsView
|
||||
x:Uid="ListDetails"
|
||||
x:Name="ListDetailsViewControl"
|
||||
BackButtonBehavior="Manual"
|
||||
Background="Transparent"
|
||||
BorderBrush="Transparent"
|
||||
DetailsTemplate="{StaticResource DetailsTemplate}"
|
||||
ItemsSource="{x:Bind ViewModel.SampleItems}"
|
||||
ItemTemplate="{StaticResource ItemTemplate}"
|
||||
ListHeaderTemplate="{StaticResource MinimalListHeaderTemplate}"
|
||||
NoSelectionContentTemplate="{StaticResource NoSelectionContentTemplate}"
|
||||
SelectedItem="{x:Bind ViewModel.Selected, Mode=TwoWay}"
|
||||
ViewStateChanged="OnViewStateChanged"/>
|
||||
</Grid>
|
||||
</Page>
|
||||
@@ -0,0 +1,29 @@
|
||||
using CommunityToolkit.WinUI.UI.Controls;
|
||||
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
|
||||
using TemplateStudioSampleApp.ViewModels;
|
||||
|
||||
namespace TemplateStudioSampleApp.Views;
|
||||
|
||||
public sealed partial class ListDetailsPage : Page
|
||||
{
|
||||
public ListDetailsViewModel ViewModel
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public ListDetailsPage()
|
||||
{
|
||||
ViewModel = App.GetService<ListDetailsViewModel>();
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void OnViewStateChanged(object sender, ListDetailsViewState e)
|
||||
{
|
||||
if (e == ListDetailsViewState.Both)
|
||||
{
|
||||
ViewModel.EnsureItemSelected();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<Page
|
||||
x:Class="TemplateStudioSampleApp.Views.MainPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Grid x:Name="ContentArea">
|
||||
|
||||
</Grid>
|
||||
</Page>
|
||||
@@ -0,0 +1,19 @@
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
|
||||
using TemplateStudioSampleApp.ViewModels;
|
||||
|
||||
namespace TemplateStudioSampleApp.Views;
|
||||
|
||||
public sealed partial class MainPage : Page
|
||||
{
|
||||
public MainViewModel ViewModel
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public MainPage()
|
||||
{
|
||||
ViewModel = App.GetService<MainViewModel>();
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
<Page
|
||||
x:Class="TemplateStudioSampleApp.Views.SettingsPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:helpers="using:TemplateStudioSampleApp.Helpers"
|
||||
xmlns:xaml="using:Microsoft.UI.Xaml"
|
||||
mc:Ignorable="d">
|
||||
<Page.Resources>
|
||||
<helpers:EnumToBooleanConverter x:Key="EnumToBooleanConverter" />
|
||||
</Page.Resources>
|
||||
<Grid>
|
||||
<StackPanel
|
||||
x:Name="ContentArea">
|
||||
<TextBlock x:Uid="Settings_Personalization" Style="{ThemeResource SubtitleTextBlockStyle}" />
|
||||
<StackPanel Margin="{StaticResource SmallTopBottomMargin}">
|
||||
<TextBlock x:Uid="Settings_Theme" />
|
||||
|
||||
<StackPanel Margin="{StaticResource XSmallTopMargin}">
|
||||
<RadioButton
|
||||
x:Uid="Settings_Theme_Light"
|
||||
Command="{x:Bind ViewModel.SwitchThemeCommand}"
|
||||
IsChecked="{x:Bind ViewModel.ElementTheme, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Light, Mode=OneWay}"
|
||||
FontSize="15"
|
||||
GroupName="AppTheme">
|
||||
<RadioButton.CommandParameter>
|
||||
<xaml:ElementTheme>Light</xaml:ElementTheme>
|
||||
</RadioButton.CommandParameter>
|
||||
</RadioButton>
|
||||
<RadioButton
|
||||
x:Uid="Settings_Theme_Dark"
|
||||
Command="{x:Bind ViewModel.SwitchThemeCommand}"
|
||||
IsChecked="{x:Bind ViewModel.ElementTheme, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Dark, Mode=OneWay}"
|
||||
FontSize="15"
|
||||
GroupName="AppTheme">
|
||||
<RadioButton.CommandParameter>
|
||||
<xaml:ElementTheme>Dark</xaml:ElementTheme>
|
||||
</RadioButton.CommandParameter>
|
||||
</RadioButton>
|
||||
<RadioButton
|
||||
x:Uid="Settings_Theme_Default"
|
||||
Command="{x:Bind ViewModel.SwitchThemeCommand}"
|
||||
IsChecked="{x:Bind ViewModel.ElementTheme, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Default, Mode=OneWay}"
|
||||
FontSize="15"
|
||||
GroupName="AppTheme">
|
||||
<RadioButton.CommandParameter>
|
||||
<xaml:ElementTheme>Default</xaml:ElementTheme>
|
||||
</RadioButton.CommandParameter>
|
||||
</RadioButton>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock x:Uid="Settings_About" Style="{ThemeResource SubtitleTextBlockStyle}" />
|
||||
|
||||
<StackPanel Margin="{StaticResource XSmallTopMargin}">
|
||||
<TextBlock Text="{x:Bind ViewModel.VersionDescription, Mode=OneWay}" Style="{ThemeResource BodyTextBlockStyle}" />
|
||||
|
||||
<TextBlock
|
||||
x:Uid="Settings_AboutDescription"
|
||||
Margin="{StaticResource XSmallTopMargin}"
|
||||
Style="{ThemeResource BodyTextBlockStyle}" />
|
||||
<HyperlinkButton x:Uid="SettingsPage_PrivacyTermsLink" Margin="{StaticResource SettingsPageHyperlinkButtonMargin}" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Page>
|
||||
@@ -0,0 +1,20 @@
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
|
||||
using TemplateStudioSampleApp.ViewModels;
|
||||
|
||||
namespace TemplateStudioSampleApp.Views;
|
||||
|
||||
// TODO: Set the URL for your privacy policy by updating SettingsPage_PrivacyTermsLink.NavigateUri in Resources.resw.
|
||||
public sealed partial class SettingsPage : Page
|
||||
{
|
||||
public SettingsViewModel ViewModel
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public SettingsPage()
|
||||
{
|
||||
ViewModel = App.GetService<SettingsViewModel>();
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<Page
|
||||
x:Class="TemplateStudioSampleApp.Views.ShellPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:helpers="using:TemplateStudioSampleApp.Helpers"
|
||||
xmlns:behaviors="using:TemplateStudioSampleApp.Behaviors"
|
||||
xmlns:i="using:Microsoft.Xaml.Interactivity"
|
||||
Loaded="OnLoaded">
|
||||
|
||||
<Grid>
|
||||
<Grid x:Name="AppTitleBar"
|
||||
Canvas.ZIndex="1"
|
||||
Height="{Binding ElementName=NavigationViewControl, Path=CompactPaneLength}"
|
||||
IsHitTestVisible="True"
|
||||
VerticalAlignment="Top">
|
||||
<Image Source="/Assets/WindowIcon.ico"
|
||||
HorizontalAlignment="Left"
|
||||
Width="16"
|
||||
Height="16" />
|
||||
<TextBlock x:Name="AppTitleBarText"
|
||||
VerticalAlignment="Center"
|
||||
TextWrapping="NoWrap"
|
||||
Style="{StaticResource CaptionTextBlockStyle}"
|
||||
Margin="28,0,0,0"/>
|
||||
</Grid>
|
||||
<NavigationView
|
||||
x:Name="NavigationViewControl"
|
||||
Canvas.ZIndex="0"
|
||||
IsBackButtonVisible="Visible"
|
||||
IsBackEnabled="{x:Bind ViewModel.IsBackEnabled, Mode=OneWay}"
|
||||
SelectedItem="{x:Bind ViewModel.Selected, Mode=OneWay}"
|
||||
IsSettingsVisible="True"
|
||||
ExpandedModeThresholdWidth="1280"
|
||||
DisplayModeChanged="NavigationViewControl_DisplayModeChanged"
|
||||
Header="{x:Bind ((ContentControl)ViewModel.Selected).Content, Mode=OneWay}">
|
||||
<NavigationView.MenuItems>
|
||||
<!--
|
||||
TODO: Update item titles by updating <x:Uid>.Content entries in Strings/en-us/Resources.resw.
|
||||
https://docs.microsoft.com/windows/uwp/app-resources/localize-strings-ui-manifest#refer-to-a-string-resource-identifier-from-xaml
|
||||
|
||||
TODO: Update item icons by updating FontIcon.Glyph properties.
|
||||
https://docs.microsoft.com/windows/apps/design/style/segoe-fluent-icons-font#icon-list
|
||||
-->
|
||||
<NavigationViewItem x:Uid="Shell_Main" helpers:NavigationHelper.NavigateTo="TemplateStudioSampleApp.ViewModels.MainViewModel">
|
||||
<NavigationViewItem.Icon>
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph=""/>
|
||||
</NavigationViewItem.Icon>
|
||||
</NavigationViewItem>
|
||||
<NavigationViewItem x:Uid="Shell_DataGrid" helpers:NavigationHelper.NavigateTo="TemplateStudioSampleApp.ViewModels.DataGridViewModel">
|
||||
<NavigationViewItem.Icon>
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph=""/>
|
||||
</NavigationViewItem.Icon>
|
||||
</NavigationViewItem>
|
||||
<NavigationViewItem x:Uid="Shell_ListDetails" helpers:NavigationHelper.NavigateTo="TemplateStudioSampleApp.ViewModels.ListDetailsViewModel">
|
||||
<NavigationViewItem.Icon>
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph=""/>
|
||||
</NavigationViewItem.Icon>
|
||||
</NavigationViewItem>
|
||||
<NavigationViewItem x:Uid="Shell_WebView" helpers:NavigationHelper.NavigateTo="TemplateStudioSampleApp.ViewModels.WebViewViewModel">
|
||||
<NavigationViewItem.Icon>
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph=""/>
|
||||
</NavigationViewItem.Icon>
|
||||
</NavigationViewItem>
|
||||
</NavigationView.MenuItems>
|
||||
<NavigationView.HeaderTemplate>
|
||||
<DataTemplate>
|
||||
<Grid>
|
||||
<TextBlock
|
||||
Text="{Binding}"
|
||||
Style="{ThemeResource TitleTextBlockStyle}" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</NavigationView.HeaderTemplate>
|
||||
<i:Interaction.Behaviors>
|
||||
<behaviors:NavigationViewHeaderBehavior
|
||||
DefaultHeader="{x:Bind ((ContentControl)ViewModel.Selected).Content, Mode=OneWay}">
|
||||
<behaviors:NavigationViewHeaderBehavior.DefaultHeaderTemplate>
|
||||
<DataTemplate>
|
||||
<Grid>
|
||||
<TextBlock
|
||||
Text="{Binding}"
|
||||
Style="{ThemeResource TitleTextBlockStyle}" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</behaviors:NavigationViewHeaderBehavior.DefaultHeaderTemplate>
|
||||
</behaviors:NavigationViewHeaderBehavior>
|
||||
</i:Interaction.Behaviors>
|
||||
<Grid Margin="{StaticResource NavigationViewPageContentMargin}">
|
||||
<Frame x:Name="NavigationFrame" />
|
||||
</Grid>
|
||||
</NavigationView>
|
||||
</Grid>
|
||||
</Page>
|
||||
@@ -0,0 +1,88 @@
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using Microsoft.UI.Xaml.Input;
|
||||
using Microsoft.UI.Xaml.Media;
|
||||
|
||||
using TemplateStudioSampleApp.Contracts.Services;
|
||||
using TemplateStudioSampleApp.Helpers;
|
||||
using TemplateStudioSampleApp.ViewModels;
|
||||
|
||||
using Windows.System;
|
||||
|
||||
namespace TemplateStudioSampleApp.Views;
|
||||
|
||||
// TODO: Update NavigationViewItem titles and icons in ShellPage.xaml.
|
||||
public sealed partial class ShellPage : Page
|
||||
{
|
||||
public ShellViewModel ViewModel
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public ShellPage(ShellViewModel viewModel)
|
||||
{
|
||||
ViewModel = viewModel;
|
||||
InitializeComponent();
|
||||
|
||||
ViewModel.NavigationService.Frame = NavigationFrame;
|
||||
ViewModel.NavigationViewService.Initialize(NavigationViewControl);
|
||||
|
||||
// TODO: Set the title bar icon by updating /Assets/WindowIcon.ico.
|
||||
// A custom title bar is required for full window theme and Mica support.
|
||||
// https://docs.microsoft.com/windows/apps/develop/title-bar?tabs=winui3#full-customization
|
||||
App.MainWindow.ExtendsContentIntoTitleBar = true;
|
||||
App.MainWindow.SetTitleBar(AppTitleBar);
|
||||
App.MainWindow.Activated += MainWindow_Activated;
|
||||
AppTitleBarText.Text = "AppDisplayName".GetLocalized();
|
||||
}
|
||||
|
||||
private void OnLoaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
|
||||
{
|
||||
TitleBarHelper.UpdateTitleBar(RequestedTheme);
|
||||
|
||||
KeyboardAccelerators.Add(BuildKeyboardAccelerator(VirtualKey.Left, VirtualKeyModifiers.Menu));
|
||||
KeyboardAccelerators.Add(BuildKeyboardAccelerator(VirtualKey.GoBack));
|
||||
}
|
||||
|
||||
private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
|
||||
{
|
||||
var resource = args.WindowActivationState == WindowActivationState.Deactivated ? "WindowCaptionForegroundDisabled" : "WindowCaptionForeground";
|
||||
|
||||
AppTitleBarText.Foreground = (SolidColorBrush)App.Current.Resources[resource];
|
||||
App.AppTitlebar = AppTitleBarText as UIElement;
|
||||
}
|
||||
|
||||
private void NavigationViewControl_DisplayModeChanged(NavigationView sender, NavigationViewDisplayModeChangedEventArgs args)
|
||||
{
|
||||
AppTitleBar.Margin = new Thickness()
|
||||
{
|
||||
Left = sender.CompactPaneLength * (sender.DisplayMode == NavigationViewDisplayMode.Minimal ? 2 : 1),
|
||||
Top = AppTitleBar.Margin.Top,
|
||||
Right = AppTitleBar.Margin.Right,
|
||||
Bottom = AppTitleBar.Margin.Bottom
|
||||
};
|
||||
}
|
||||
|
||||
private static KeyboardAccelerator BuildKeyboardAccelerator(VirtualKey key, VirtualKeyModifiers? modifiers = null)
|
||||
{
|
||||
var keyboardAccelerator = new KeyboardAccelerator() { Key = key };
|
||||
|
||||
if (modifiers.HasValue)
|
||||
{
|
||||
keyboardAccelerator.Modifiers = modifiers.Value;
|
||||
}
|
||||
|
||||
keyboardAccelerator.Invoked += OnKeyboardAcceleratorInvoked;
|
||||
|
||||
return keyboardAccelerator;
|
||||
}
|
||||
|
||||
private static void OnKeyboardAcceleratorInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
|
||||
{
|
||||
var navigationService = App.GetService<INavigationService>();
|
||||
|
||||
var result = navigationService.GoBack();
|
||||
|
||||
args.Handled = result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
<Page
|
||||
x:Class="TemplateStudioSampleApp.Views.WebViewPage"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:behaviors="using:TemplateStudioSampleApp.Behaviors"
|
||||
behaviors:NavigationViewHeaderBehavior.HeaderMode="Never"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<Grid x:Name="ContentArea">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<WebView2
|
||||
x:Name="WebView"
|
||||
Source="{x:Bind ViewModel.Source, Mode=OneWay}" />
|
||||
|
||||
<StackPanel
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Visibility="{x:Bind ViewModel.IsLoading, Mode=OneWay}">
|
||||
<ProgressRing IsActive="{x:Bind ViewModel.IsLoading, Mode=OneWay}" />
|
||||
<TextBlock x:Uid="WebView_Loading" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Visibility="{x:Bind ViewModel.HasFailures, Mode=OneWay}">
|
||||
<TextBlock x:Uid="WebView_FailedMessage" HorizontalAlignment="Center" TextWrapping="WrapWholeWords" />
|
||||
<HyperlinkButton x:Uid="WebView_Reload" Command="{x:Bind ViewModel.ReloadCommand}" HorizontalAlignment="Center" />
|
||||
</StackPanel>
|
||||
|
||||
<Grid Grid.Row="1">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Button x:Uid="BrowserBackButton" Command="{x:Bind ViewModel.BrowserBackCommand, Mode=OneWay}" Margin="{StaticResource XSmallLeftTopRightBottomMargin}" Padding="{StaticResource XXSmallLeftTopRightBottomMargin}">
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="" />
|
||||
</Button>
|
||||
<Button x:Uid="BrowserForwardButton" Command="{x:Bind ViewModel.BrowserForwardCommand, Mode=OneWay}" Margin="{StaticResource XSmallLeftTopRightBottomMargin}" Padding="{StaticResource XXSmallLeftTopRightBottomMargin}">
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="" />
|
||||
</Button>
|
||||
</StackPanel >
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
|
||||
<Button x:Uid="ReloadButton" Command="{x:Bind ViewModel.ReloadCommand}" Margin="{StaticResource XSmallLeftTopRightBottomMargin}" Padding="{StaticResource XXSmallLeftTopRightBottomMargin}">
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="" />
|
||||
</Button>
|
||||
<Button x:Uid="OpenInBrowserButton" Command="{x:Bind ViewModel.OpenInBrowserCommand}" Margin="{StaticResource XSmallLeftTopRightBottomMargin}" Padding="{StaticResource XXSmallLeftTopRightBottomMargin}">
|
||||
<FontIcon FontFamily="{StaticResource SymbolThemeFontFamily}" Glyph="" />
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Page>
|
||||
@@ -0,0 +1,22 @@
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
|
||||
using TemplateStudioSampleApp.ViewModels;
|
||||
|
||||
namespace TemplateStudioSampleApp.Views;
|
||||
|
||||
// To learn more about WebView2, see https://docs.microsoft.com/microsoft-edge/webview2/.
|
||||
public sealed partial class WebViewPage : Page
|
||||
{
|
||||
public WebViewViewModel ViewModel
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public WebViewPage()
|
||||
{
|
||||
ViewModel = App.GetService<WebViewViewModel>();
|
||||
InitializeComponent();
|
||||
|
||||
ViewModel.WebViewService.Initialize(WebView);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user