在Shell中从菜单按钮调用视图方法
本文关键字:调用 视图 方法 按钮 菜单 Shell | 更新日期: 2023-09-27 18:02:53
我正在使用Template10为我正在创建的UWP应用程序。我使用的是Hamburger模板。我想在汉堡包菜单中有一个次要按钮,调用活动视图的刷新方法。
我的计划是在汉堡包菜单的二级命令中放置一个普通按钮,并在onclick事件中调用刷新方法。我将在我所有的视图上有一个带有refresh方法的接口,这样每个视图都会有这个方法。
获得活动视图引用的最佳方法是什么,以便我可以从shell中的onclick事件调用该方法?
要实现这一点,我们可以在HamburgerMenu.SecondaryButtons
中添加HamburgerButtonInfo
,如:
<Controls:HamburgerButtonInfo x:Name="RefreshButton" ButtonType="Command" Tapped="RefreshButton_Tapped">
<StackPanel Orientation="Horizontal">
<SymbolIcon Width="48" Height="48" Symbol="Refresh" />
<TextBlock Margin="12,0,0,0" VerticalAlignment="Center" Text="Refresh" />
</StackPanel>
</Controls:HamburgerButtonInfo>
然后在代码隐藏中,我们可以在Shell
类(如RefreshEvent
)中添加Event
。在其他视图中,我们可以订阅这个事件。当我们点击刷新按钮时,我们可以调用这个事件来执行刷新。例如:
public event Action RefreshEvent;
private void RefreshButton_Tapped(object sender, RoutedEventArgs e)
{
RefreshEvent?.Invoke();
}
在MainPageViewModel.cs
public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> suspensionState)
{
if (suspensionState.Any())
{
Value = suspensionState[nameof(Value)]?.ToString();
}
Views.Shell.Instance.RefreshEvent += Refresh;
await Task.CompletedTask;
}
public override async Task OnNavigatingFromAsync(NavigatingEventArgs args)
{
args.Cancel = false;
Views.Shell.Instance.RefreshEvent -= Refresh;
await Task.CompletedTask;
}
private void Refresh()
{
//TODO
}
这里我以ViewModel为例,您也可以在视图的代码中实现它。但是请注意,当我们导航到一个视图时,我们需要订阅RefreshEvent
,当我们离开该视图时,我们需要取消订阅,以便RefreshEvent
只引用活动视图。