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



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

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

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

目前为止,一切都好。当我单击按钮时,将在内容控件中激活一个新视图。问题是当每个按钮的"关联视图"处于活动状态时,我需要更改样式,而我真的不知道如何实现此功能。你有什么建议吗?

我对 Caliburn Micro 和 WPF 样式相当陌生,因此任何帮助将不胜感激。

我对此不是很确定,但我仍然可以想到这样的事情,

您可以创建样式并将样式添加到按钮。像这样的东西

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

您可以将此样式添加到按钮中。

我可以想到您可以使用的两个可能选项:

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

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

这意味着您的视图模型将知道您可能不想要的样式。如果是这种情况,选项二是编写一个 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)中搜索具有提供给 ChangeButtonStyle ctor 的第一个参数的名称的控件,然后使用作为第二个参数提供给ChangeButtonStyle ctor 的资源键设置该控件的 style 属性。

您可以使用

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

我认为它确实可以解决问题...

最新更新