wpf - WPF Path 对象中的属性或数据触发器

标签 wpf wpf-controls

我在堆栈面板中有一个 TextBlock 和两个路径对象(向上箭头和向下箭头)。 TextBlock 绑定(bind)到一个名为“Change”的属性,该属性可能具有 -1,0,1 等值。

问题 我想在 1 的情况下显示向上箭头,或者在 -1 的情况下显示向下箭头,或者在 0 的情况下不显示这些 Path 对象。

为了实现这一目标,我在路径类型上定义了样式触发器。

问题

我无法让它工作。我是否遗漏了什么或者有更好的方法来做到这一点。

XAML

<StackPanel Orientation="Horizontal">
    <TextBlock Name="changeLbl" Margin="0,0,10,0" Text="{Binding Path=Change}"/>
         <Path Fill="{Binding ElementName=changeLbl,Path=Foreground}" Style="{StaticResource downChangePathTrigger}"/>
                <Path Fill="{Binding ElementName=changeLbl,Path=Foreground}" Style="{StaticResource upChangePathTrigger}"/>
                </StackPanel>

样式资源

<Style x:Key="upChangePathTrigger" TargetType="Path">
            <Setter Property="Visibility" Value="Collapsed" />
            <Setter Property="HorizontalAlignment" Value="Center" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="Data" Value="M 0 4 L 4 0 L 8 4 Z" />
            <Setter Property="StrokeThickness" Value="5" />
            <Setter Property="Stroke" Value="GreenYellow"/>
            <Style.Triggers>
                <Trigger Property="Fill" Value="GreenYellow">
                    <Setter Property="Visibility" Value="Visible"/>
                </Trigger>
                </Style.Triggers>
        </Style>
        <Style x:Key="downChangePathTrigger" TargetType="Path">
            <Setter Property="Visibility" Value="Collapsed" />
            <Setter Property="HorizontalAlignment" Value="Center" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="Data" Value="M 0 0 L 4 4 L 8 0 Z" />
            <Setter Property="StrokeThickness" Value="5" />
            <Setter Property="Stroke" Value="Red"/>
            <Style.Triggers>
                <Trigger Property="Fill" Value="Red">
                    <Setter Property="Visibility" Value="Visible"/>
                </Trigger>
            </Style.Triggers>
        </Style>

更新答案

样式触发器

<Style x:Key="changePathTrigger" TargetType="Path">
            <Setter Property="Visibility" Value="Hidden" />
            <Setter Property="HorizontalAlignment" Value="Center" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="StrokeThickness" Value="5" />
            <Style.Triggers>
                <!--<DataTrigger Binding="{Binding Path=Change,Converter={StaticResource doubleToIntConverter}}" Value="0">
                    <Setter Property="Stroke" Value="0"/>
                </DataTrigger>-->
                <DataTrigger Binding="{Binding Path=Change,Converter={StaticResource doubleToIntConverter}}" Value="1">
                    <Setter Property="Visibility" Value="Visible"/>
                    <Setter Property="Data" Value="M 0 4 L 4 0 L 8 4 Z"/>
                    </DataTrigger>
                <DataTrigger Binding="{Binding Path=Change,Converter={StaticResource doubleToIntConverter}}" Value="-1">
                    <Setter Property="Visibility" Value="Visible"/>
                    <Setter Property="Data" Value="M 0 0 L 4 4 L 8 0 Z"/>
                    </DataTrigger>
            </Style.Triggers>
        </Style>

Xaml

<Path Fill="{Binding ElementName=changeLbl,Path=Foreground}" Stroke="{Binding ElementName=changeLbl,Path=Foreground}" Style="{StaticResource changePathTrigger}"/>

最佳答案

这是一个奇怪的结构(触发 Path.VisibilityPath.Fill 颜色绑定(bind)到 TextBlock.Foreground),但它会与合作

<TextBlock Name="changeLbl" Margin="0,0,10,0" Text="{Binding Path=Change}">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <Trigger Property="Text" Value="1">
                    <Setter Property="Foreground" Value="GreenYellow" />
                </Trigger>
                <Trigger Property="Text" Value="-1">
                    <Setter Property="Foreground" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

但我认为你应该减少依赖关系,例如将路径样式中的 Trigger 替换为 DataTrigger 以直接依赖于属性“Change”。例如,您可以更改 PathTextBlock 颜色,并且 Visibility 仍然有效。

<Style x:Key="upChangePathTrigger" TargetType="Path">
    ...
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=Change}" Value="1">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

关于wpf - WPF Path 对象中的属性或数据触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17933431/

相关文章:

wpf - 加速混淆过程

wpf - 无法将属性 '[attr]' 中的值转换为类型 'System.Windows.TemplateBindingExtension' 的对象

validation - Wpf 组合框限制为列表

WPF dataGrid 多列的 super 标题

wpf - 我是在模型还是在ViewModel上加载数据?

c# - MVVM WPF : Change property of item by name from ViewModel

wpf - Windows 8 下的 WPF 和 Silverlight 的 future 会怎样?

c# - TextBox 更新后的 KeyUp 事件

wpf - 使用ContentControl生成 View (UserControls)

c# - Canvas 上的 ScaleTransform 调整大小以比 child 更高的速度缩小 Canvas