【问题标题】:WPF Trigger, is it like an if/else?WPF 触发器,它像 if/else 吗?
【发布时间】:2014-09-13 12:04:50
【问题描述】:

我最近一直在阅读触发器并试图将其合并到我的应用程序中,但我一直认为触发器的行为类似于 if 语句,如果此属性具有此值,请对控件执行此操作。

我想知道我们是否可以在另一个触发器中更改不同控件的属性?我希望删除动态创建的额外行或仅在隐藏按钮或窗口上有特定标签文本时将按钮的宽度增加 3 列。

我试图弄清楚如何做到这一点,但我正在尝试的任何事情都要求我只更改触发器内的控件的属性,它不允许我更改控制在触发器之外。

这是我想做的:

<Style x:Key="Triggers" TargetType="{x:Type Label}">
        <Style.Triggers>
            <Trigger Property="Label.Content" Value="Test Label1: ">
                <Setter TargetName="Button1" Property="Grid.ColumnSpan" Value="3" /> 'Error 13  Cannot find the Trigger target 'Button1'.  (The target must appear before any Setters, Triggers, or Conditions that use it.)    

            </Trigger>
        </Style.Triggers>   
    </Style>

我的想法是触发器是 IF,如果逻辑匹配(属性为真),setter 是 IF 中的代码 - 所以如果标签包含文本“测试标签 1:”然后增加按钮宽度为 3 列。我认为触发器具有它们没有的功能吗?这可以在 xaml 中实现吗?

【问题讨论】:

  • 是的,就是这样。
  • 您应该将条件逻辑放在 ViewModel 中,然后在针对按钮的样式中使用 DataTrigger 以相应地更改其属性。无论如何,您必须使用按钮样式的Trigger,而不是标签样式的触发器。

标签: wpf vb.net triggers


【解决方案1】:

Trigger 有点像 XAML 中的 if 条件。但是,当使用 Trigger 更改依赖于另一个控件的属性时,请尽量记住以下经验法则:

Trigger 添加到必须对另一个控件中的更改做出反应的控件中

在您的情况下,您希望ButtonLabel.Content = Test Label1: 时跨越某些列,因此您需要将Trigger 应用于Button。此外,要从Button 中读取Label.Content 的值,您需要使用DataTrigger。试试这个:

<Button Content="Something">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Content, ElementName=LabelName}" 
                    Value="Test Label1: ">
                    <Setter Property="Grid.ColumnSpan" Value="3" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多