Стиль кнопки WPF в зависимости от активного представления

#wpf #binding #caliburn.micro

#wpf #привязка #caliburn.micro

Вопрос:

Я использую Caliburn Micro для разработки простого MVVM-приложения WPF.

Мой ShellView имеет один ContentControl и три кнопки, каждая из которых привязывается к общедоступному методу в моей ShellViewModel, скажем, ActivateView1, ActivateView2 и ActivateView3.

Моя ShellViewModel наследуется от Conductor и вызывает каждый метод Activate ActivateItem(new View1ViewModel()) и т.д.

Пока все хорошо. Когда я нажимаю кнопку, в ContentControl активируется новое представление. Проблема в том, что мне нужно, чтобы каждая кнопка меняла стиль, когда активен ее «связанный вид», и я действительно понятия не имею, как добиться этой функциональности. У вас есть какие-либо предложения?

Я довольно новичок в Caliburn Micro и WPF-styling, поэтому буду признателен за любую помощь.

Ответ №1:

Я не очень уверен в этом, но все же я могу придумать что-то вроде этого,

вы можете создать стиль и добавить его к своей кнопке. что-то вроде этого

 <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
            <Style.Triggers>
                <Trigger Property="IsPressed" Value="True">
                         <Setter Property="Fill" TargetName="yourButtonName" Value="Black"/>
                         <Setter Property="Margin" TargetName="yourButtonName" Value="5,0,5,0"/>
                </Trigger>
            </Style.Triggers>
</Style>
  

и вы можете добавить этот стиль к своей кнопке.

Комментарии:

1. Это не сработает. Когда я нажимаю другую кнопку и активируется другое представление, этот стиль больше не должен быть активирован 🙂

2. вы можете добавить другое действие триггера <Свойство триггера = значение «IsPressed» =»False»> и обновить значение параметра установки

3. Это не заставит его оставаться активным — только при нажатии кнопки. Он должен быть «синхронизирован» с текущим представлением, отображаемым в элементе управления содержимым. Я думал о создании трех логических свойств в моей ViewModel и обновлении их при изменении представления. Что вы думаете об этом.

4. Это сработает, .. или же вы можете использовать переключатель вместо обычной кнопки и оформить их так, чтобы они выглядели как обычная кнопка. и переключайте стиль, когда он отмечен или снят.

5. Как я могу изменить стили в зависимости от значения свойства?

Ответ №2:

Я могу придумать два возможных варианта, которые вы могли бы использовать:

Вы могли бы привязать свойства стиля ваших кнопок к свойствам вашей ShellViewModel. В этих свойствах вы можете определить стиль для возврата на основе активного представления оболочки, т.Е.

 return ActiveItem == button1ViewModel ? 
                     (Style) App.Current.Resources["Button1ActiveStyleKey"] :
                     (Style) App.Current.Resources["Button1InactiveStyleKey"];
  

это означало бы, что ваша ViewModel будет знать о стилях, которые вам могут не понадобиться. Если это так, вторым вариантом было бы написать Caliburn.Micro IResult , который изменяет стиль кнопки и возвращает 3 из них (по одному для каждой кнопки) из сопрограммы, которая вызывается нажатием кнопки, т.Е.

 public IEnumerable<IResult> ButtonOneClicked()
{
    yield return new ChangeButtonStyle("Button1Name", "Button1ActiveStyleKey");
    yield return new ChangeButtonStyle("Button2Name", "Button2InactiveStyleKey");
    yield return new ChangeButtonStyle("Button3Name", "Button3InactiveStyleKey");
}
  

Реализация ChangeButtonStyle IResult выполняла бы поиск в представлении (предоставляемом через ActionExecutionContext параметр to IResult.Execute ) элемента управления с именем, указанным в 1-м параметре ChangeButtonStyle ctor, а затем устанавливала свойство style этого элемента управления, используя ключ ресурса, предоставленный в качестве 2-го параметра ChangeButtonStyle ctor.

Ответ №3:

Вы можете использовать

 <Trigger Property ="IsPressed" Value ="True">
  

Я думаю, что это делает свое дело…