【问题标题】:WPF button styling depending on active viewWPF 按钮样式取决于活动视图
【发布时间】:2011-05-11 19:28:05
【问题描述】:

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

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

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

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

我对 Caliburn Micro 和 WPF 样式还很陌生,因此我们将不胜感激。

【问题讨论】:

    标签: wpf binding caliburn.micro


    【解决方案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>
    

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

    【讨论】:

    • 那行不通。当我按下另一个按钮并激活另一个视图时,不应再激活该样式:)
    • 您可以添加另一个触发操作 并更新 setter 值
    • 这不会使它保持活动状态-仅在按下按钮时。它必须与内容控件中显示的当前视图“同步”。我正在考虑在我的 ViewModel 中创建三个布尔属性,并在发生视图更改时更新它们。您对此有何看法。
    • 这将起作用,.. 否则您可以使用常规按钮的单选按钮并将它们设置为看起来像常规按钮。并在选中或取消选中时切换样式。
    • 如何根据属性值更改样式?
    【解决方案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 参数提供给IResult.Execute)以查找具有提供给ChangeButtonStyle ctor 的第一个参数的名称的控件,然后设置样式属性使用作为ChangeButtonStyle ctor 的第二个参数提供的资源键来控制该控件。

    【讨论】:

      【解决方案3】:

      你可以使用

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多