WPF触发器,它是否像if / else?

时间:2014-07-22 15:17:52

标签: wpf vb.net triggers

我最近一直在阅读触发器,并且正在尝试将其合并到我的应用程序中,但我一直认为触发器就像if语句一样,如果此属性具有此值,则对控件执行此操作。 / p>

我想知道的是,我们是否可以在另一个触发器中更改不同的控件属性?我想要删除一个动态创建的额外行,或者只有当一个按钮被隐藏或者窗口上有特定标签文本时才增加按钮的宽度为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中的代码 - 所以如果Label包含文本'Test Label1:'则增加按钮宽度为3列。我认为触发器具有它们没有的功能,这是否可以在xaml中进行?

1 个答案:

答案 0 :(得分:0)

Trigger有点像XAML中的if条件。但是,当使用Trigger更改依赖于其他控件的属性时,请尝试记住此经验法则:

  

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

在您的情况下,当Button = Label.Content时,您希望Test Label1:跨越某些列,因此您需要将Trigger应用于Button 1}}而不是。此外,要从Label.Content读取Button的值,您需要使用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>