基于现有值的计算的Setter值 - WPF

时间:2013-03-18 00:53:07

标签: wpf triggers setter

目前有如下设置:

<Trigger Property="IsMouseOver" Value="True">
    <Setter TargetName="rectName" Property="Stroke" Value="Red"/>                                            
    <Setter TargetName="rectName" Property="StrokeThickness" Value="2"/>                    
</Trigger>

即。触发器在MouseOver上将矩形的描边和粗细更改为红色和2。 但这只有在矩形的笔划为黑色时才会发生(很少有矩形具有透明笔划)

有没有办法把这个条件放在Setter上?我正在寻找一种不太干扰的方式来实现这一目标。任何线索?

是否有类似下面的构造:

<Setter TargetName="rectName" Property="Stroke" Value="If Black Then Black Else Red"/>                                            

2 个答案:

答案 0 :(得分:1)

这里有用,但是请注意,这个代码会抛出一个堆栈溢出异常,因为鼠标悬停时更改颜色会发生变化,即红黑红黑等等:/我只是建议其他一些方法来跟踪rect状态,也许是ViewModel中的一个变量,它跟踪状态并在代码中替换:

<Condition  Binding="{Binding RelativeSource={RelativeSource Self}, Path=Stroke}" Value="Black" />

有类似的东西:

<Condition Binding="{Path=RectState}" Value="True" />

否则会崩溃:)(抱歉匆匆写这篇文章)

 <Rectangle Height="100" HorizontalAlignment="Left" Margin="182,152,0,0" Name="rectangle1" VerticalAlignment="Top" Width="200" >
        <Rectangle.Style>
            <Style TargetType="Rectangle">
                <Setter Property="Fill" Value="Transparent" />
                <Setter Property="Stroke" Value="Black" />
                <Style.Triggers>                      
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition  Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
                            <Condition  Binding="{Binding RelativeSource={RelativeSource Self}, Path=Stroke}" Value="Black" />
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.Setters>
                            <Setter Property="StrokeThickness" Value="2" />
                            <Setter Property="Stroke" Value="Red" />
                        </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </Rectangle.Style>
    </Rectangle>

答案 1 :(得分:0)

您可以使用MultiTrigger实现此目的(以下代码未经过测试,但应足够接近)

 <Style.Triggers>
     <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="IsMouseOver" Value="True" />
            <Condition Property="Stroke" Value="Black" />
        </MultiTrigger.Conditions>
        <Setter TargetName="rectName" Property="Stroke" Value="Red" />
        <Setter TargetName="rectName" Property="StrokeThickness" Value="2" />
     </MultiTrigger>
 </Style.Triggers>