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

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

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

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

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

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


person Vern    schedule 11.05.2011    source источник


Ответы (3)


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

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

<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>

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

person nipiv    schedule 11.05.2011
comment
Это не сработает. Когда я нажимаю другую кнопку и активируется другой вид, этот стиль больше не должен активироваться :) - person Vern; 12.05.2011
comment
вы можете добавить еще одно действие триггера ‹Свойство триггера =IsPressed Value =False› и обновить значение установщика - person nipiv; 12.05.2011
comment
Это не заставит его оставаться активным - только при нажатии кнопки. Он должен быть синхронизирован с текущим представлением, отображаемым в элементе управления содержимым. Я думал о создании трех логических свойств в моей ViewModel и обновлении их при изменении представления. Что ты об этом думаешь. - person Vern; 12.05.2011
comment
Это будет работать, или вы можете использовать переключатель вместо обычной кнопки и стилизовать их, чтобы они выглядели как обычная кнопка. и переключать стиль, когда он отмечен или не отмечен. - person nipiv; 12.05.2011
comment
Как изменить стили в зависимости от значения свойства? - person Vern; 16.05.2011

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

Вы можете привязать свойства стиля кнопок к свойствам 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 для IResult.Execute) элемент управления с именем, указанным в 1-м параметре ChangeButtonStyle ctor, а затем устанавливать свойство стиля этого элемента управления, используя ключ ресурса, предоставленный как 2-й параметр для ChangeButtonStyle ctor.

person Simon Fox    schedule 13.05.2011

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

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

Я думаю, что это делает трюк ...

person Timbioz    schedule 15.11.2015