PGi*_*oUk 4 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>
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想将其设为超链接,以便用户在单击单元格内容时可以对注释执行某些操作。
我还有另一列,它是 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>
Run Code Online (Sandbox Code Playgroud)
超链接列的 XAML 的一个问题是 IsTabStop = False 似乎不起作用,当通过网格进行 Tab 键切换时,我的超链接列仍然会获得焦点,这与我使用设置器更改 IsTabStop 的其他列不同。如果到了紧要关头,我可以忍受,但我不愿意。
我实际上想要从这两列中得到的是两种外观/行为的合并,即数据显示在超链接上的列,其中 TabStop = False 并且当鼠标悬停在列上时显示不同属性的工具提示。
任何人都可以帮助建议我如何获得实现以下目标的专栏:
预先感谢任何可以提供帮助的人。
我过去曾遇到过超链接问题,因此我将这种样式用于标签或按钮,使它们看起来像超链接。尝试将您的列模板制作为按钮或标签并应用此样式。
<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>
Run Code Online (Sandbox Code Playgroud)