Внешний вид и поведение гиперссылок WPF DataGrid - PullRequest
4 голосов
/ 07 июля 2011

Я довольно новичок в WPF, мне есть чему поучиться, и я думаю, что медленно туда добираюсь. У меня есть DataGrid, который используется для отображения и ввода данных пользователем, это довольно сложная Grid, так как она является основным направлением всего приложения. У меня есть несколько столбцов, которые доступны только для чтения, и я использовал CellStyle Setter, чтобы установить для KeyboardNavigation.IsTabStop значение False, чтобы пользовательский фокус был сосредоточен на важных столбцах, и это прекрасно работает. Мне бы хотелось, чтобы пара столбцов только для чтения была гиперссылкой, показывающей всплывающую подсказку и не получавшей фокус, однако я изо всех сил пытаюсь написать XAML, который будет одновременно выполнять все три требования.

В одном из столбцов указывается, есть ли у элемента в строке какие-либо примечания. Я использовал следующий XAML, чтобы отобразить свойство HasNotes в ячейке в DataGridTemplateColumn, а во всплывающей подсказке отобразить актуальные заметки в свойстве 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

            <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 не работает, когда при переходе через таблицу столбец с моей гиперссылкой все еще получает фокус, в отличие от других столбцов, в которых я использовал установщик для поменяй IsTabStop. Если толчок настанет, я могу с этим смириться, но я бы не стал.

То, что я на самом деле хочу от обоих этих столбцов, - это объединение двух появлений / поведений, то есть столбцов, в которых данные отображаются по гиперссылке, где TabStop = False и которые отображают всплывающую подсказку с другим свойством при наведении.

Может кто-нибудь помочь мне посоветовать, как получить столбец, который достигает следующего:

  1. Гиперссылка, отображающая одно свойство
  2. Подсказка, отображающая другое свойство
  3. IsTabStop = False, который фактически работает при использовании с гиперссылкой

Заранее спасибо всем, кто может помочь.

1 Ответ

4 голосов
/ 07 июля 2011

В прошлом у меня были проблемы с гиперссылкой, поэтому используйте этот стиль, который я использую для надписей или кнопок, чтобы они выглядели как гиперссылки. Попробуйте превратить ваш шаблон-столбец в кнопку или метку и применить этот стиль.

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