【问题标题】:changing contents of a button programmatically以编程方式更改按钮的内容
【发布时间】:2023-03-23 22:04:01
【问题描述】:

我有一个名为 btnLogin 的按钮,我希望在变量更改时更改此按钮的内容。基本上我有一个登录屏幕,一旦用户登录成功,我正在设置一个变量,并根据这个变量,我希望内容改变。

所以现在我有一个登录屏幕并且在登录时,我正在设置这个变量:-

        ApplicationState.SetValue("UserLoggedIn", "True");

然后在主屏幕中,当加载窗口时,我有这段代码:-

    private void CheckLoginButton()
    {
        //check if user is checked in or out
        if (String.IsNullOrEmpty(ApplicationState.GetValue<string>("UserLoggedIn")))
        {
            //User not logged in
            ImageSource largeImageSource =
                new BitmapImage(new Uri(@"/myAppWPF;component/Images/administrator-icon32.png", UriKind.Relative));
            ImageSource smallImageSource =
                new BitmapImage(new Uri(@"/myAppWPF;component/Images/administrator-icon16.png", UriKind.Relative));
            btnLogin.LargeImageSource = largeImageSource;
            btnLogin.SmallImageSource = smallImageSource;
            btnLogin.Label = "Login";
            btnLogin.ToolTipTitle = "Please Log In";

        }
        else
        {
            //User logged in
            ImageSource largeImageSource =
                new BitmapImage(new Uri(@"/myAppWPF;component/Images/logout32.png", UriKind.Relative));
            ImageSource smallImageSource =
                new BitmapImage(new Uri(@"/myAppWPF;component/Images/logout16.png", UriKind.Relative));
            btnLogin.LargeImageSource = largeImageSource;
            btnLogin.SmallImageSource = smallImageSource;
            btnLogin.Label = "Log Out";
            btnLogin.ToolTipTitle = "Log Out";
        }
    }

在 XAML 中我有以下内容:-

<r:RibbonGroup Name="AdminGroup" Header="Admin" >
    <r:RibbonButton Name="btnLogin" Click="btnLogin_Click" ></r:RibbonButton>
</r:RibbonGroup>

然而,每次 btnLogin 总是设置为 Login 而从不注销,即使变量设置正确。

我需要重新注册这个按钮吗?还是我做错了什么?

感谢您的帮助和时间

【问题讨论】:

  • 窗口是在登录前加载还是在登录后加载?

标签: wpf button user-controls wpf-controls


【解决方案1】:

在 WPF 中执行此操作的典型方法是使用模型-视图-视图模型模式。阅读更多关于它的信息here

基本上,您必须创建一个类(ViewModel),它会在 UserLoggedIn(模型)更改时通知您的按钮(视图)它必须更改其内容。此类必须实现INotifyPropertyChanged 并在 UserLoggedIn 的值发生变化时触发 PropertyChanged 事件,从而使 UI 发生相应的变化。因此,您几乎不应该从代码中引用您的按钮 (btnLogin),而是应该将按钮数据绑定到 XAML 中的 ViewModel 对象中的变量,并在它更改时收到通知。

使用这种模式的好处在于,您将对大部分逻辑使用声明性方法,使用数据绑定和触发器,并且 UI 逻辑将与您的业务逻辑分开。如果您是 WPF 新手,我建议您先阅读 MVVM 模式,因为从长远来看,它会为您节省大量时间。

您在此处显示的逻辑执行的任务与触发器执行的任务完全相同,但您可能将业务代码与 UI 代码混合在一起(即您有一个管理登录的类知道哪个用户登录时显示的图片)。

但是,如果您想坚持自己的设计。我猜问题是您只运行该代码一次(“加载窗口时我有这段代码”),并且您应该在用户登录时运行 CheckLoginButton,或者更准确地说,当 UserLoggedIn 值更改时对或错。

【讨论】:

  • 您好胡安,感谢您的回复。是的,我需要阅读和研究 MVVM 模式,但是目前我正在构建一个小应用程序只是为了习惯 WPF。我在构造函数中有代码是的。我以登录屏幕为例。因此,当我关闭“登录”窗口时,控制权被传递回主构造函数,并且我检查了变量设置是否正确,并且执行了正确的代码段。然而,一切都还是一样!所以我在想也许我需要刷新一些东西才能让它工作
  • 这个问题你解决了吗?据我了解,您有两个窗口:一个主窗口和一个登录窗口,对吗?问题可能出在您正在使用的控件中(即 r:RibbonButton),这是您创建的自定义控件吗?它有 ControlTemplate 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多