Как указать всплывающую подсказку для элемента управления в стиле из XAML? - PullRequest
14 голосов
/ 28 апреля 2009

Я использую сетку данных WPF из проекта Microsoft CodePlex. У меня есть пользовательский элемент управления, который я хочу привязать к полю из строки таблицы данных. Я не могу понять, как задать всплывающую подсказку для строки таблицы данных.

Самое близкое, что я пришел, - это использование RowStyle с Setter для установки всплывающей подсказки, но, похоже, это работает только для текста. Когда я пытаюсь поместить ControlTempalte в качестве значения для всплывающей подсказки, он отображает результат вызова ToString для типа ControlTemplate.

Я думаю, мне нужно установить свойство "Template" в всплывающей подсказке, но я не могу понять, как это сделать ...

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

Ответы [ 6 ]

26 голосов
/ 28 апреля 2009

Разобрался ... у меня ушло около 6 часов ...

По какой-то причине я не могу установить значение напрямую, используя Value.Setter. Если я определю содержание для всплывающей подсказки как статический ресурс, а затем установлю его в свойстве Style объекта DataGrid.RowStyle, оно будет работать.

Итак, стиль строки сетки данных выглядит следующим образом:

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

Спасибо!

6 голосов
/ 12 марта 2010

Ключ должен использовать Property ToolTipService.ToolTip вместо ToolTip - как это:

<Setter Property="ToolTipService.ToolTip" Value="My Tooltip"/>
1 голос
/ 11 июня 2012

Я также получил эту работу с парой изменений; включенный, если это кому-то помогает.

Мой Datadrid связан со списком пользовательских объектов, я хотел отобразить строку «Имя» в виде столбца и строку «текст» во всплывающей подсказке. Уловка для меня (новичка) заключалась в том, что мне пришлось включить текстовую колонку и скрыть ее, чтобы она отображалась во всплывающей подсказке, т.е.

<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>
0 голосов
/ 25 апреля 2011

Мне нужно было установить подсказку динамически в зависимости от содержимого ячейки. Я использую подсказку для отображения текста переполнения текста из ячейки. Привязка ниже взята из свойства класса c # с именем 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>
0 голосов
/ 28 апреля 2009

Не уверен, что вы можете сделать это через XAML.

Более простым способом может быть просто обработка события LoadingRow. В 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;
}

Очевидно, вам придется изменить код в зависимости от того, как вы заполняете данные в сетке данных. Это также не проверено =)

0 голосов
/ 28 апреля 2009

Нет необходимости в ControlTemplate. Если вы хотите StackPanel в ToolTip, просто установите его как:

<Setter Property="ToolTip">
    <Setter.Value>
        <StackPanel>
            <TextBlock>txt1</TextBlock><TextBlock>txt2</TextBlock>
        </StackPanel>
    </Setter.Value>
</Setter>
...