【问题标题】:WPF Edit Resource Dictionary dynamically passing parametersWPF 编辑资源字典动态传递参数
【发布时间】:2015-03-16 09:24:58
【问题描述】:

我在资源字典中定义了一种样式,因此该样式可以在我的整个应用程序中使用。

<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>

我在 Datagrid 中这样使用样式:

<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 种颜色。

例如,我的数据网格有 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”,但结果相同。

我需要改变解决这个问题的方法吗?我读过也许我们不能在标签属性上添加触发器。

谢谢

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    我建议如果你这样设置标签

    <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>
    

    【讨论】:

    • 我的单元格模板似乎有错误,如果我绑定到相对 Source = Hyperlink(而不是文本块),我可以有颜色,但如果我这样做,我会丢失我的所有 mouseOver 属性超链接。为什么当我的超链接悬停时它没有进入其样式的“IsMouseOver”触发器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多