C# 从Shell中菜单中的按钮调用View方法

C# 从Shell中菜单中的按钮调用View方法,c#,xaml,uwp,template10,C#,Xaml,Uwp,Template10,我正在为我正在创建的UWP应用程序使用Template10。我正在使用汉堡包模板。我想在hamburger菜单中有一个辅助按钮,用于调用活动视图的刷新方法 我的计划是在hamburger菜单的辅助命令中放置一个普通按钮,并在onclick事件中调用refresh方法。我在所有视图上都有一个使用refresh方法的界面,因此每个视图都有该方法 获取对活动视图的引用的最佳方法是什么,以便我可以从shell中的onclick事件调用该方法?为了实现这一点,我们可以在汉堡菜单中添加汉堡按钮信息 <

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

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


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

为了实现这一点,我们可以在
汉堡菜单中添加
汉堡按钮信息

<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>
在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
}
NavigatedToAsync上的公共重写异步任务(对象参数、NavigationMode模式、IDictionary SuspendionState) { if(suspensionState.Any()) { Value=suspensionState[nameof(Value)]?.ToString(); } Views.Shell.Instance.RefreshEvent+=刷新; 等待任务。完成任务; } NavigatingFromAsync上的公共重写异步任务(NavigatingEventArgs args args) { args.Cancel=false; Views.Shell.Instance.RefreshEvent-=刷新; 等待任务。完成任务; } 私有无效刷新() { //待办事项 }

这里我使用了ViewModel,例如,您也可以在视图的代码隐藏中实现它。但是请注意,当我们导航到某个视图时,我们需要订阅
RefreshEvent
,当我们离开该视图时,我们需要取消订阅,以便
RefreshEvent
仅引用活动视图。

谢谢!正是我想要的。一个完美的推荐,杰。教科书太完美了。@JohnSullivan很高兴知道它有帮助。那么,这是对你的问题的回答吗?
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
}