WPF按钮样式取决于活动视图

时间:2011-05-11 19:28:06

标签: wpf binding caliburn.micro

我正在使用Caliburn Micro开发一个简单的MVVM WPF应用程序。

我的ShellView有一个ContentControl和三个按钮,每个按钮绑定到我的ShellViewModel中的公共方法,比如说ActivateView1,ActivateView2和ActivateView3。

我的ShellViewModel继承自Conductor,每个Activate方法都调用ActivateItem(new View1ViewModel())等。

到目前为止一切顺利。单击按钮时,将在ContentControl中激活新视图。问题是我需要每个按钮在其“关联视图”处于活动状态时更改样式,我真的不知道如何实现此功能。你有什么建议吗?

我对Caliburn Micro和WPF造型相当陌生,所以我们非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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 :(得分:0)

我可以想到两种可能的选择:

您可以将按钮样式属性绑定到ShellViewModel上的属性。在这些属性中,您可以根据shell活动视图确定要返回的样式,即

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

这意味着您的ViewModel会知道您可能不想要的样式。如果是这种情况,那么选择两个就是编写一个Caliburn.Micro IResult来改变按钮的样式,并从通过按钮点击调用的Coroutine返回其中的3个(每个按钮一个),即< / p>

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),以获取名称提供给ChangeButtonStyle的第一个参数的控件ctor,然后使用作为ChangeButtonStyle ctor的第二个参数提供的资源键设置该控件的style属性。

答案 2 :(得分:0)

您可以使用

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

我认为这样做了......