C#使用Template10在Hamburger菜单中显示用户名

时间:2015-12-26 20:44:51

标签: c# winrt-xaml uwp template10

我正在使用Windows 10 UWP应用,我正在使用Template10 library中的空白模板。我能够让汉堡包菜单顺利运行。该应用程序要求用户先登录,然后进入该应用程序的“主页”。我想在登录后将汉堡菜单底部的用户ID显示为辅助按钮,如果他们没有登录(或退出),则显示登录选项。

这是应该显示用户ID的辅助按钮的XAML:

<controls:HamburgerButtonInfo>
            <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                <SymbolIcon Symbol="Contact"  Width="48" Height="48"  />
                <TextBlock Name="Username" Margin="12, 0, 0, 0" VerticalAlignment="Center"/>
            </StackPanel>
</controls:HamburgerButtonInfo>

代码隐藏只是默认构造函数,用于启用汉堡菜单shell,并添加代码以显示用户名。

public Shell(NavigationService navigationService)
    {
        this.InitializeComponent();
        Menu.NavigationService = navigationService;
        if(user logged in)
        {
            Username.Text = Username;
        }
        else
        {
            Username.Text = "login";
        }
    }

代码部分工作,即使在用户登录后也显示“登录”。仅当应用程序暂停/恢复或退出/重新启动时,才会显示用户名。如何确保用户一旦登录,汉堡菜单shell中的辅助按钮就会更新,而无需重新启动/恢复应用程序?

1 个答案:

答案 0 :(得分:2)

由于您使用的是Template10,我建议您查看模型视图模型模式(Channel9 introductive video)

使用此模式,您可以删除代码背后的部分,并且从XAML级别,您可以执行以下操作:

<TextBlock Name="Username" Text="{Binding UserDataContext.LoginString}" Margin="12, 0, 0, 0" VerticalAlignment="Center"/>

UserDataContext是对ViewModel类的引用,它暴露了一些属性,如LoginString,可以是这样的:

public string LoginString
{
    get
    {
        return _loginString;
    }

    set
    {
        if (_loginString == value)
        {
            return;
        }

        _loginString = value;
        RaisePropertyChanged(() => LoginString);
    }
}

每次从您的代码中您都会更改_loginString 的属性,您的TextBlock将被通知,其文本将被更新。这样,您就不必在Shell构造函数中更改HamburgerButtonInfo文本,而是在UserDataContext中的任何位置更改。

请注意,RaisePropertyChanged来自MVVM Light Toolkit