【问题标题】:WPF DataGrid Hyperlink Appearance and BehaviourWPF DataGrid 超链接外观和行为
【发布时间】:2023-03-21 06:23:02
【问题描述】:

我对 WPF 很陌生,要学习的东西太多了,我想我正在慢慢实现。我有一个用于显示和用户输入的 DataGrid,它是一个非常棘手的 Grid,因为它是整个应用程序的主要焦点。我有一些只读列,我使用 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>

这很好,但我想将其设为超链接,以便用户在单击单元格内容时可以对注释进行操作。

我还有另一列是 DataGridHyperlinkColumn,用于在超链接上显示度量单位,单击时用户可以更改单位。 (我之所以这样做,而不是例如 ComboBox,是因为我希望用户能够更改单位,但我想制作界面,以便更改单位,而不是可以偶然完成的事情)。以下 XAML 为 Unit 设置了 Hyperlink 列

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

超链接列的 XAML 的一个问题是 IsTabStop = False 似乎不起作用,当通过 Grid 切换时,我的超链接列仍然获得焦点,这与我使用 setter 的其他列不同更改 IsTabStop。如果迫在眉睫,我可以忍受,但我宁愿不这样做。

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

谁能帮助建议我如何获得实现以下目标的专栏:

  1. 显示一个属性的超链接
  2. 显示不同属性的工具提示
  3. IsTabStop = False 与超链接一起使用时实际有效

提前感谢任何可以提供帮助的人。

【问题讨论】:

    标签: wpf xaml wpfdatagrid


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了!设法将它放在我的 DataGrid 中的两列上,整理工具提示并停止它接收焦点,它的外观和行为与超链接完全一样。正是我想要的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 2023-03-08
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2011-08-16
    • 2015-04-05
    相关资源
    最近更新 更多