Как указать подсказку для элемента управления в стиле из XAML?
Я использую WPat datagrid из проекта Microsoft CodePlex. У меня есть настраиваемый элемент управления, который я хочу привязать к полю из строки datagrid. Я не могу для жизни понять, как указать всплывающую подсказку в строке datagrid.
Ближе всего я пришел, чтобы использовать RowStyle с Setter для установки всплывающей подсказки, но это, похоже, работает только для текста. Когда я пытаюсь поместить ControlTempalte в качестве значения для всплывающей подсказки, он отображает результат вызова ToString в типе ControlTemplate.
Мне кажется, мне нужно установить свойство Template в ToolTip, но я не могу понять, как это сделать...
<dg:DataGrid Name="dgResults" AutoGenerateColumns="True">
<dg:DataGrid.RowStyle >
<Style TargetType="{x:Type dg:DataGridRow}">
<Setter Property="ToolTip" >
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToolTip}">
<StackPanel>
<TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</dg:DataGrid.RowStyle>
</dg:DataGrid>
Ответы
Ответ 1
Подумал... взял меня около 6 часов...
По какой-то причине я не могу установить значение напрямую с помощью Value.Setter. Если я определяю содержимое для всплывающей подсказки как статического ресурса, но затем задаю его в свойстве Style для DataGrid.RowStyle, он работает.
Итак, стиль строки datagrid выглядит так:
<Style TargetType="{x:Type dg:DataGridRow}">
<Setter Property="ToolTip" Value="{StaticResource resKWIC}">
</Setter>
</Style>
</dg:DataGrid.RowStyle>
И ресурс
<Window.Resources>
<StackPanel x:Key="resKWIC">
<TextBlock>f1</TextBlock>
<TextBlock>f2></TextBlock>
</StackPanel>
</Window.Resources>
Спасибо!
Ответ 2
Ключ должен использовать Property ToolTipService.ToolTip, а не ToolTip - вот так:
<Setter Property="ToolTipService.ToolTip" Value="My Tooltip"/>
Ответ 3
Я также получил эту работу с несколькими изменениями; Включено, если он помогает кому-то.
My Datadrid привязан к списку пользовательских объектов, я хотел отобразить строку "Имя" в качестве столбца и строку "текст" в всплывающей подсказке. Хитрость для меня (newbe) заключалась в том, что я должен был включать текстовую колонку и скрывать ее для ее отображения в подсказке, то есть:
<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" EnableRowVirtualization="False" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" IsReadOnly="True" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" Name="dgrTextGroupText" VerticalContentAlignment="Stretch" Grid.Column="3" Grid.Row="1" Grid.RowSpan="6" CanUserReorderColumns="False" CanUserSortColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" Width="*" />
<DataGridTextColumn Binding="{Binding Text}" Width="0" Visibility="Hidden" />
</DataGrid.Columns>
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.text}" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
Ответ 4
Нет необходимости в ControlTemplate
. Если вы хотите StackPanel
в ToolTip
, просто установите его как:
<Setter Property="ToolTip">
<Setter.Value>
<StackPanel>
<TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock>
</StackPanel>
</Setter.Value>
</Setter>
Ответ 5
Не уверен, что вы можете сделать это через XAML.
Более простой способ - просто обработать событие LoadRow. В xaml есть что-то вроде:
<dg:DataGrid Name="dgResults" AutoGenerateColumns="True"
LoadingRow="dgResults_LoadingRow"
ItemsSource="{Binding ListOfStrings}" />
Затем в коде <
void dgResults_LoadingRow(object sender, DataGridRowEventArgs e)
{
DataGridRow row = e.Row;
row.ToolTip = row.DataContext as string;
}
Очевидно, вам придется изменить код в зависимости от того, как вы заполняете данные в datagrid. Это также непроверено =)
Ответ 6
Мне нужно было настроить подсказку динамически на основе содержимого ячейки. Я использую всплывающую подсказку для отображения текста переполнения текста из ячейки. Ниже приведена привязка от свойства класса С# с именем CellText. Благодаря вышеприведенным сообщениям, позволяющим мне полностью понять все.
<DataGridTextColumn Header="HeaderText" Binding="{Binding DisplayText, Mode=OneWay}" Width="33*">
<DataGridTextColumn.CellStyle>
<Style>
<Setter Property="ToolTipService.ToolTip" Value="{Binding DisplayText, Mode=OneWay}"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>