Wpf 以编程方式更改按钮的内容

Wpf 以编程方式更改按钮的内容,wpf,button,user-controls,wpf-controls,Wpf,Button,User Controls,Wpf Controls,我有一个名为btnLogin的按钮,我希望在变量更改时更改此按钮的内容。基本上,我有一个登录屏幕,一旦用户成功登录,我将设置一个变量,根据这个变量,我希望更改内容 因此,目前我有一个登录屏幕,在登录时,我设置此变量:- ApplicationState.SetValue("UserLoggedIn", "True"); 然后在主屏幕中,当加载窗口时,我有一段代码:- private void CheckLoginButton() { //chec

我有一个名为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";
        }
    }
private void CheckLoginButton()
{
//检查用户是否签入或签出
if(String.IsNullOrEmpty(ApplicationState.GetValue(“UserLoggedIn”))
{
//用户未登录
图像源大图像源=
新的位图图像(新的Uri(@/myAppWPF;component/Images/administrator-icon32.png),UriKind.Relative);
ImageSource smallImageSource=
新的位图图像(新的Uri(@/myAppWPF;component/Images/administrator-icon16.png),UriKind.Relative);
btnLogin.LargeImageSource=LargeImageSource;
btnLogin.SmallImageSource=SmallImageSource;
btnLogin.Label=“登录”;
btnLogin.ToolTipTitle=“请登录”;
}
其他的
{
//用户登录
图像源大图像源=
新的位图图像(新的Uri(@/myAppWPF;component/Images/logout32.png”,UriKind.Relative));
ImageSource smallImageSource=
新的位图图像(新的Uri(@/myAppWPF;component/Images/logout16.png”,UriKind.Relative));
btnLogin.LargeImageSource=LargeImageSource;
btnLogin.SmallImageSource=SmallImageSource;
btnLogin.Label=“注销”;
btnLogin.ToolTipTitle=“注销”;
}
}
在XAML中,我有以下内容:-

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

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

我需要再次注册此按钮吗?还是我做错了什么


感谢您的帮助和时间

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

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

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

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


然而,如果你想坚持你的设计。我猜问题在于,您只需运行该代码一次(“在加载窗口时,我有这段代码”),当用户登录时,或者更准确地说,当UserLoggedIn值更改为true或false时,您应该运行CheckLoginButton。

是在登录之前还是之后加载窗口?Hi Juan,感谢您的回复。是的,我需要阅读和研究MVVM模式,但是目前我正在构建一个小应用程序,只是为了适应WPF。我在承包商那里有代码是的。我以loginscreen为例。因此,当我关闭“Login”窗口时,控制被传递回主构造函数,并且我已经检查了变量设置是否正确以及执行的代码是否正确。然而,一切都是一样的!所以我在想,也许我需要更新一些东西,让它工作。你解决这个问题了吗?据我所知,您有两个窗口:一个主窗口和一个登录窗口,对吗?问题可能出在您正在使用的控件(即r:RibbonButton)中,这是您创建的自定义控件吗?它有控制模板吗?