изменение содержимого кнопки программно - PullRequest
0 голосов
/ 05 ноября 2011

У меня есть кнопка с именем 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 и никогда на Logout, даже если переменная установлена ​​правильно.

Нужно ли снова регистрировать эту кнопку? Или я что-то не так делаю?

Спасибо за вашу помощь и время

1 Ответ

0 голосов
/ 06 ноября 2011

Типичный способ сделать это в WPF - использовать шаблон Model-View-ViewModel. Подробнее об этом здесь

По сути, вы должны создать класс (ViewModel), который будет уведомлять вашу кнопку (представление), что она должна изменить свое содержимое при изменении UserLoggedIn (модель). Этот класс должен реализовывать INotifyPropertyChanged и запускать событие PropertyChanged при изменении значения UserLoggedIn, соответственно изменяя пользовательский интерфейс. Таким образом, вы почти никогда не должны ссылаться на свою кнопку (btnLogin) из кода, вместо этого кнопка должна быть привязана к переменной в вашем объекте ViewModel из XAML и получать уведомления при ее изменении.

Прелесть использования этого шаблона в том, что вы будете использовать декларативный подход для большей части логики, используя привязку данных и триггеры, и что логика пользовательского интерфейса будет отделена от вашей бизнес-логики. Если вы новичок в WPF, я предлагаю вам сначала прочитать о шаблоне MVVM, так как это сэкономит вам много времени в долгосрочной перспективе.

Логика, которую вы показываете там, выполняет ту же задачу, что и триггер, но вы, вероятно, смешиваете бизнес-код с кодом пользовательского интерфейса (т. Е. У вас есть класс, который управляет как логином , так и , который знает, какая картинка чтобы показать, когда пользователь вошел в систему).

Однако, если вы хотите придерживаться своего дизайна. Я предполагаю, что проблема в том, что вы выполняете этот код только один раз («У меня есть этот кусок кода, когда окно загружено»), и вы должны запустить CheckLoginButton, когда пользователь входит в систему, или, точнее, при изменении значения UserLoggedIn истинно или ложно.

...