UWP C# WINUI NavigationView 如何访问其他pages/views
UWP C# WINUI NavigationView How to access other pages/views
我正在根据 Using the NavigationView in your UWP applications 教程使用 navigation view
编写应用程序。
我希望有人能帮助澄清两件事
放置常规例程的最佳做法是什么?在 MainPage.xaml.cs
或 xaml
各自的视图中?
如何在不同的视图中更新我的 xaml
元素,例如 textblock
?
例如。
我在启动时有一个 readHardwareID
例程 运行 来读取 MainPage.xaml.cs
中的硬件 ID 如何显示 InfoPage.xaml
.
中的信息
我的UI
请指教,
谢谢。
更新时间:2020 年 6 月 8 日
我正在尝试将一个简单的 AppVerison text
从 MainPage 传递到 InfoPage 以测试 OnNavigateTo
。但是,当我 运行 代码并单击 info
选项卡时,我 运行 进入此错误。
主页代码
public String AppVersionName = "Test version 1.0";
private void nvTopLevelNav_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
{
if (args.IsSettingsInvoked)
{
contentFrame.Navigate(typeof(SettingsPage));
} else
{
TextBlock ItemContent = args.InvokedItem as TextBlock;
if (ItemContent != null)
{
switch (ItemContent.Tag)
{
case "Nav_Home":
contentFrame.Navigate(typeof(HomePage));
break;
case "Nav_Devices":
contentFrame.Navigate(typeof(DevicesPage));
break;
case "Nav_Log":
contentFrame.Navigate(typeof(LogPage));
break;
case "Nav_Info":
contentFrame.Navigate(typeof(InfoPage));
break;
}
}
}
信息页代码
public sealed partial class InfoPage : Page
{
private MainPage mainPage;
string appVersion;
public InfoPage(MainPage page)
{
this.InitializeComponent();
mainPage = page;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var data = e.Parameter;
appVersion = mainPage.AppVersionName;
readHardwareID();
}
public void readHardwareID()
{
var deviceIdtoken = HardwareIdentification.GetPackageSpecificToken(null);
var deviceId = deviceIdtoken.Id;
var deviceIdReader = DataReader.FromBuffer(deviceId);
byte[] deviceIdbytes = new byte[deviceId.Length];
deviceIdReader.ReadBytes(deviceIdbytes);
DeviceID.Text = BitConverter.ToString(deviceIdbytes);
var sysIdToken = SystemIdentification.GetSystemIdForPublisher();
var sysId = sysIdToken.Id;
var sysIdReader = DataReader.FromBuffer(sysId);
byte[] sysIdbytes = new byte[sysId.Length];
sysIdReader.ReadBytes(sysIdbytes);
SystemID.Text = BitConverter.ToString(sysIdbytes);
// get the system family information
string deviceFamily = AnalyticsInfo.VersionInfo.DeviceFamily;
Device.Text = deviceFamily;
// get the system version number
var deviceFamilyVersion = AnalyticsInfo.VersionInfo.DeviceFamilyVersion.ToString();
var version = ulong.Parse(deviceFamilyVersion);
var majorVersion = (version & 0xFFFF000000000000L) >> 48;
var minorVersion = (version & 0x0000FFFF00000000L) >> 32;
var buildVersion = (version & 0x00000000FFFF0000L) >> 16;
var revisionVersion = (version & 0x000000000000FFFFL);
var systemVersion = $"{majorVersion}.{minorVersion}.{buildVersion}.{revisionVersion}";
OSVersion.Text = systemVersion.ToString();
AppVersion.Text = appVersion;
}
}
what is the best practice to place my general routines? in the MainPage.xaml.cs or the xaml in respective views?
如果您想使用 NavigationView
作为应用程序的基础架构,我们建议您使用 Windows Template Studio to make NavigationView
UWP template app. You could add the specific the page with Windows Template Studio
. For more please refer link here。
How do i update my xaml element such as textblock in a different view? eg. I have a readHardwareID routine run at startup to read the hardware ID in MainPage.xaml.cs How do I display the information in InfoPage.xaml
如果您已在 MainPage
中加载数据,则可以在导航到 InfoPage
并从 OnNavigatedTo 覆盖方法获取数据时使用 Frame.Navigate
方法对参数进行分页。
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var data = e.Parameter;
}
我从下面的 link 中找到了 navigation
的简单解释。
由于我是一个没有太多软件开发背景的硬件人,所以官方文档的示例和参考资料有限让我感到困惑。
我建议这个简单的示例能够帮助很多初学者,因为它非常简单、直接和清晰。
Pass parameters between UWP pages (common types string, int, and custom types)
解决这个问题可能很容易。通常 NavigationView 的内容是特定的用户控件。此示例与问题中的示例非常接近,但更容易一些并且不使用“字符串映射”。它只是交换其特定内容。本例不考虑调出设置
C#:
private void NavigationViewControl_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
{
switch (sender.MenuItems.IndexOf(args.InvokedItemContainer))
{
case 0:
sender.Content = new TripPlanning();
break;
case 1:
sender.Content = new History();
break;
case 2:
sender.Content = new About();
break;
}
}
XAML:
<Grid>
<NavigationView x:Name="NavigationViewControl" Background="LightBlue" IsBackButtonVisible="Collapsed"
IsSettingsVisible="False"
ItemInvoked="NavigationViewControl_ItemInvoked">
<NavigationView.MenuItems>
<NavigationViewItem Content="Haltestellen" x:Name="A" Icon="Map"/>
<NavigationViewItem Content="Letzte Abfragen" x:Name="B" Icon="Bookmarks"/>
<NavigationViewItem Content="Über die App" x:Name="C" Icon="Important"/>
</NavigationView.MenuItems>
</NavigationView>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="{x:Bind NavigationViewControl.CompactModeThresholdWidth}"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="NavigationViewControl.PaneDisplayMode" Value="Top"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
我正在根据 Using the NavigationView in your UWP applications 教程使用 navigation view
编写应用程序。
我希望有人能帮助澄清两件事
放置常规例程的最佳做法是什么?在
MainPage.xaml.cs
或xaml
各自的视图中?如何在不同的视图中更新我的
中的信息xaml
元素,例如textblock
? 例如。 我在启动时有一个readHardwareID
例程 运行 来读取MainPage.xaml.cs
中的硬件 ID 如何显示InfoPage.xaml
.
我的UI
请指教, 谢谢。
更新时间:2020 年 6 月 8 日
我正在尝试将一个简单的 AppVerison text
从 MainPage 传递到 InfoPage 以测试 OnNavigateTo
。但是,当我 运行 代码并单击 info
选项卡时,我 运行 进入此错误。
主页代码
public String AppVersionName = "Test version 1.0";
private void nvTopLevelNav_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
{
if (args.IsSettingsInvoked)
{
contentFrame.Navigate(typeof(SettingsPage));
} else
{
TextBlock ItemContent = args.InvokedItem as TextBlock;
if (ItemContent != null)
{
switch (ItemContent.Tag)
{
case "Nav_Home":
contentFrame.Navigate(typeof(HomePage));
break;
case "Nav_Devices":
contentFrame.Navigate(typeof(DevicesPage));
break;
case "Nav_Log":
contentFrame.Navigate(typeof(LogPage));
break;
case "Nav_Info":
contentFrame.Navigate(typeof(InfoPage));
break;
}
}
}
信息页代码
public sealed partial class InfoPage : Page
{
private MainPage mainPage;
string appVersion;
public InfoPage(MainPage page)
{
this.InitializeComponent();
mainPage = page;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var data = e.Parameter;
appVersion = mainPage.AppVersionName;
readHardwareID();
}
public void readHardwareID()
{
var deviceIdtoken = HardwareIdentification.GetPackageSpecificToken(null);
var deviceId = deviceIdtoken.Id;
var deviceIdReader = DataReader.FromBuffer(deviceId);
byte[] deviceIdbytes = new byte[deviceId.Length];
deviceIdReader.ReadBytes(deviceIdbytes);
DeviceID.Text = BitConverter.ToString(deviceIdbytes);
var sysIdToken = SystemIdentification.GetSystemIdForPublisher();
var sysId = sysIdToken.Id;
var sysIdReader = DataReader.FromBuffer(sysId);
byte[] sysIdbytes = new byte[sysId.Length];
sysIdReader.ReadBytes(sysIdbytes);
SystemID.Text = BitConverter.ToString(sysIdbytes);
// get the system family information
string deviceFamily = AnalyticsInfo.VersionInfo.DeviceFamily;
Device.Text = deviceFamily;
// get the system version number
var deviceFamilyVersion = AnalyticsInfo.VersionInfo.DeviceFamilyVersion.ToString();
var version = ulong.Parse(deviceFamilyVersion);
var majorVersion = (version & 0xFFFF000000000000L) >> 48;
var minorVersion = (version & 0x0000FFFF00000000L) >> 32;
var buildVersion = (version & 0x00000000FFFF0000L) >> 16;
var revisionVersion = (version & 0x000000000000FFFFL);
var systemVersion = $"{majorVersion}.{minorVersion}.{buildVersion}.{revisionVersion}";
OSVersion.Text = systemVersion.ToString();
AppVersion.Text = appVersion;
}
}
what is the best practice to place my general routines? in the MainPage.xaml.cs or the xaml in respective views?
如果您想使用 NavigationView
作为应用程序的基础架构,我们建议您使用 Windows Template Studio to make NavigationView
UWP template app. You could add the specific the page with Windows Template Studio
. For more please refer link here。
How do i update my xaml element such as textblock in a different view? eg. I have a readHardwareID routine run at startup to read the hardware ID in MainPage.xaml.cs How do I display the information in InfoPage.xaml
如果您已在 MainPage
中加载数据,则可以在导航到 InfoPage
并从 OnNavigatedTo 覆盖方法获取数据时使用 Frame.Navigate
方法对参数进行分页。
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var data = e.Parameter;
}
我从下面的 link 中找到了 navigation
的简单解释。
由于我是一个没有太多软件开发背景的硬件人,所以官方文档的示例和参考资料有限让我感到困惑。
我建议这个简单的示例能够帮助很多初学者,因为它非常简单、直接和清晰。
Pass parameters between UWP pages (common types string, int, and custom types)
解决这个问题可能很容易。通常 NavigationView 的内容是特定的用户控件。此示例与问题中的示例非常接近,但更容易一些并且不使用“字符串映射”。它只是交换其特定内容。本例不考虑调出设置
C#:
private void NavigationViewControl_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
{
switch (sender.MenuItems.IndexOf(args.InvokedItemContainer))
{
case 0:
sender.Content = new TripPlanning();
break;
case 1:
sender.Content = new History();
break;
case 2:
sender.Content = new About();
break;
}
}
XAML:
<Grid>
<NavigationView x:Name="NavigationViewControl" Background="LightBlue" IsBackButtonVisible="Collapsed"
IsSettingsVisible="False"
ItemInvoked="NavigationViewControl_ItemInvoked">
<NavigationView.MenuItems>
<NavigationViewItem Content="Haltestellen" x:Name="A" Icon="Map"/>
<NavigationViewItem Content="Letzte Abfragen" x:Name="B" Icon="Bookmarks"/>
<NavigationViewItem Content="Über die App" x:Name="C" Icon="Important"/>
</NavigationView.MenuItems>
</NavigationView>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="{x:Bind NavigationViewControl.CompactModeThresholdWidth}"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="NavigationViewControl.PaneDisplayMode" Value="Top"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>