在Shell中从菜单按钮调用视图方法

本文关键字:调用 视图 方法 按钮 菜单 Shell | 更新日期: 2023-09-27 18:02:53

我正在使用Template10为我正在创建的UWP应用程序。我使用的是Hamburger模板。我想在汉堡包菜单中有一个次要按钮,调用活动视图的刷新方法。

我的计划是在汉堡包菜单的二级命令中放置一个普通按钮,并在onclick事件中调用刷新方法。我将在我所有的视图上有一个带有refresh方法的接口,这样每个视图都会有这个方法。

获得活动视图引用的最佳方法是什么,以便我可以从shell中的onclick事件调用该方法?

在Shell中从菜单按钮调用视图方法

要实现这一点,我们可以在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。在其他视图中,我们可以订阅这个事件。当我们点击刷新按钮时,我们可以调用这个事件来执行刷新。例如:

在Shell.xaml.cs

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只引用活动视图。