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

时间:2016-08-17 18:01:33

标签: c# xaml uwp template10

我正在使用Template10来创建我正在创建的UWP应用程序。我正在使用汉堡模板。我想在汉堡菜单中有一个辅助按钮来调用活动视图的刷新方法。

我的计划是在汉堡菜单的辅助命令中放置一个普通按钮,在onclick事件中调用refresh方法。我将使用refresh方法在我的所有视图上都有一个接口,因此每个视图都有方法。

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

1 个答案:

答案 0 :(得分:1)

为实现这一目标,我们可以在HamburgerButtonInfo中添加HamburgerMenu.SecondaryButtons,例如:

<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>

然后在代码隐藏中,我们可以在Event类中添加Shell,例如RefreshEvent。在其他视图中,我们可以订阅此事件。当我们单击/点击刷新按钮时,我们可以调用此事件来执行刷新。例如:

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