WPF DataGrid超链接外观和行为

时间:2011-07-07 12:43:02

标签: wpf xaml wpfdatagrid

我对WPF很新,有很多东西需要学习,我想我会慢慢地到达那里。我有一个用于显示和用户输入的DataGrid,它是一个非常棘手的网格,因为它是整个应用程序的主要焦点。我有一些只读的列,我使用CellStyle Setter将KeyboardNavigation.IsTabStop设置为False,以保持用户输入集中在重要的列上,并且工作正常。我想将一些只读列作为显示工具提示但未获得焦点的超链接,但我正在努力编写同时满足所有三个要求的XAML。

其中一列是指示行上的项目是否有任何注释。我使用以下XAML在DataGridTemplateColumn的单元格中显示HasNotes属性,并在工具提示中显示Notes属性中的实际注释:

            <DataGridTemplateColumn x:Name="NotesColumn" Header="Notes">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding HasNotes, Mode=OneWay}">
                            <TextBlock.ToolTip>
                                <TextBlock Text="{Binding Notes}" MaxWidth="300" TextWrapping="Wrap" />
                            </TextBlock.ToolTip>
                        </TextBlock>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellStyle>
                    <Style>
                        <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
                    </Style>
                </DataGridTemplateColumn.CellStyle>
            </DataGridTemplateColumn>

这样可以正常工作,但我想把它变成一个超链接,这样用户可以在点击单元格内容时对Notes做些什么。

我有另一个列,它是一个DataGridHyperlinkColumn,用于在超链接上显示度量单位,单击时用户可以更改单位。 (我这样做的原因,而不是像ComboBox那样,是因为我希望用户能够更改我希望制作界面的单元,以便更改它是一个非常慎重的行为单位,不是可以意外完成的事情)。以下XAML将“超链接”列置于“单元”

            <DataGridHyperlinkColumn x:Name="ResultUnitLink" Binding="{Binding Path=Unit.Code}" Header="Unit" Width="Auto" IsReadOnly="True">
                <DataGridHyperlinkColumn.CellStyle>
                    <Style>
                        <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
                    </Style>
                </DataGridHyperlinkColumn.CellStyle>
                <DataGridHyperlinkColumn.ElementStyle>
                    <Style>
                        <EventSetter Event="Hyperlink.Click" Handler="ChangeUnit" />
                    </Style>
                </DataGridHyperlinkColumn.ElementStyle>
            </DataGridHyperlinkColumn>

Hyperlink列的XAML的一个问题是,IsTabStop = False似乎不起作用,当通过Grid选项卡时,我的超链接列仍然会收到焦点,这与我使用setter的其他列不同改变IsTabStop。如果推动推动我可以忍受,但我宁愿没有。

我真正想从这两列中得到的是两个外观/行为的合并,即数据显示在超链接上的列,其中TabStop = False,并且在悬停时显示不同属性的工具提示。

任何人都可以帮助建议我如何获得一个实现以下目标的专栏:

  1. 显示一个属性的超链接
  2. 显示不同属性的工具提示
  3. IsTabStop = False,当与超链接一起使用时实际上有效
  4. 提前感谢任何可以提供帮助的人。

1 个答案:

答案 0 :(得分:4)

我过去曾经遇到过Hyperlink的问题,所以我使用这个样式用于标签或按钮,使它们看起来像超链接。尝试将列模板制作成Button或Label并应用此样式。

<Style x:Key="ButtonAsLinkStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                    <ContentPresenter ContentStringFormat="{TemplateBinding ContentStringFormat}" />
                </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="Blue" />
    <Setter Property="Cursor" Value="Hand" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>