WPF 编辑资源字典动态传递参数



>我的资源字典中定义了样式,因此该样式可以用于我的应用程序。

<Style x:Key="HyperlinkStyle" TargetType="{x:Type Hyperlink}">
        <Setter Property="Foreground" Value="{StaticResource Color3}" />
        <Setter Property="Cursor" Value="Hand" />
        <Setter Property="TextBlock.TextDecorations" Value="{x:Null}" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="{StaticResource Color3Pressed}" />
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Foreground" Value="{StaticResource Color2NotEnabled}" />
            </Trigger>
        </Style.Triggers>
    </Style>

我在数据网格中使用这样的样式:

<DataGridTemplateColumn Width="140*"  CanUserReorder="False" CanUserResize="True" Header="">
                            <DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate />
                            </DataGridTemplateColumn.CellEditingTemplate>
                            <DataGridTemplateColumn.CellStyle>
                                <Style TargetType="DataGridCell" BasedOn="{StaticResource DatagridCellHyperlinkStyle}">
                                    <Setter Property="IsEnabled" Value="{Binding Path=MyObject, Converter={StaticResource ConverterMyObject}}"/>
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate>
                                                <Border Padding="{TemplateBinding Padding}"  VerticalAlignment="Center">
                                                    <TextBlock Width="Auto" Height="Auto" TextTrimming="CharacterEllipsis">
                                            <Hyperlink IsEnabled="{TemplateBinding IsEnabled}">
                                             <InlineUIContainer TextDecorations="{Binding Path=TextDecorations, RelativeSource={RelativeSource AncestorType=TextBlock}}" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType=TextBlock}}">
                                              <ContentPresenter Width="Auto" Height="Auto" Content="{Binding DataContext.MyObject.Name, RelativeSource={RelativeSource AncestorType=DataGridRow}}"/>
                                             </InlineUIContainer>
                                                <Hyperlink.Style>
                                                    <Style TargetType="Hyperlink" BasedOn="{StaticResource HyperlinkStyle}">
                                                                    <EventSetter Event="Hyperlink.Click" Handler="Clic" />

                                                        </Style>
                                                </Hyperlink.Style>
                                            </Hyperlink>
                                                    </TextBlock>
                                                </Border>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </DataGridTemplateColumn.CellStyle>
                        </DataGridTemplateColumn>

这很好用,但我希望我的风格能够有 2 种颜色,具体取决于参数。

例如,我的 datagrid 有 1500 行,我想通过更改超链接颜色来突出显示集合中的 100 行。

所以我认为最好的方法是将超链接的 Tag 属性设置为自定义值并在样式中使用它。按照这个答案: https://social.msdn.microsoft.com/Forums/vstudio/en-US/d3424267-ed1f-4b30-90a1-5cca9843bd22/problem-making-a-trigger-on-the-tag-property?forum=wpf,我进行了以下更改:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

首先,我手动为每一行设置标签以查看样式是否更改:

<Hyperlink IsEnabled="{TemplateBinding IsEnabled}" Tag="10">

并将此触发器添加到我的超链接的样式中:

<Trigger Property="Tag">
            <Trigger.Value>
                <sys:Byte>10</sys:Byte> <!-- My highlighted object -->
            </Trigger.Value>
            <Setter Property="Foreground" Value="{StaticResource Color1}" />
        </Trigger>

但是当我启动我的应用程序时它不起作用(我仍然有"Color3",而当 Tag 等于 10 时我想要"Color1"。我已经检查了输出,没有任何错误。

我试图将"sys:Byte"更改为"sys:String",但结果是一样的。

我需要改变我的方法吗?我已经读过也许我们不能在标签属性上添加触发器。

谢谢

我建议你这样设置标签

<Hyperlink IsEnabled="{TemplateBinding IsEnabled}" Tag="10">

然后以相同的方式编写触发器:

<Trigger Property="Tag" Value="10">
   ...setter
</Trigger>

或者,如果在超链接中使用字节类型作为标记:

<Hyperlink IsEnabled="{TemplateBinding IsEnabled}">
    <Hyperlink.Tag>
       <sys:Byte>10</sys:Byte>
    </Hyperlink.Tag>
</Hyperlink>

然后触发器也是如此:

<Trigger Property="Tag">
    <Trigger.Value>
       <sys:Byte>10</sys:Byte>
    </Trigger.Value>
   ...setter
</Trigger>

最新更新