2009-04-28 7 views
14

Ich verwende ein WPF-Datagrid aus dem Microsoft CodePlex-Projekt. Ich habe ein benutzerdefiniertes Steuerelement, das ich an ein Feld aus der Zeile des Datagrids binden soll. Ich kann nicht für das Leben von mir herausfinden, wie man einen Tooltip auf einer Datagridreihe spezifiziert.Wie Sie eine QuickInfo für ein Steuerelement in einem Style von XAML angeben?

Die nächste, die ich komme, ist die Verwendung eines RowStyle mit einem Setter, um den Tooltip einzustellen, aber das scheint nur für Text zu funktionieren. Wenn ich versuche, einen ControlTempalte als Wert für die QuickInfo zu verwenden, wird das Ergebnis des Aufrufs von ToString für den ControlTemplate-Typ angezeigt.

Ich glaube, ich brauche die „Template“ Eigenschaft des ToolTip festlegen, aber ich kann nicht scheinen, um herauszufinden, wie das zu tun ...

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

@Sean - nervig, um es gelinde auszudrücken. Verbrachte über 15-20 Minuten mit diesem Schädling eines Problems ... Ich würde gerne wissen, warum das so ist. – Gishu

Antwort

25

figured it out ... dauerte etwa 6 Stunden ...

Aus irgendeinem Grund kann ich nicht den Wert direkt eingestellt Value.Setter verwenden. Wenn ich den Inhalt für den Tooltip jedoch als statische Ressource definieren und dann in der Style-Eigenschaft des DataGrid.RowStyle festlegen, funktioniert er. So sieht

die Datagrid Zeile Stil wie:

  <Style TargetType="{x:Type dg:DataGridRow}"> 

       <Setter Property="ToolTip" Value="{StaticResource resKWIC}"> 
       </Setter>     
      </Style> 

     </dg:DataGrid.RowStyle> 

Und die Ressource

<Window.Resources> 
    <StackPanel x:Key="resKWIC"> 
     <TextBlock>f1</TextBlock> 
     <TextBlock>f2></TextBlock> 
    </StackPanel> 
</Window.Resources> 

Dank!

+0

Danke, du hast mir sehr geholfen :) – ScorpiAS

0

Es für die ControlTemplate keine Notwendigkeit. Wenn Sie die StackPanel im ToolTip wollen, setzen Sie es einfach als:

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

Du würdest das denken, aber das funktioniert nicht. Gibt Ausnahme: Inhalt des Typs 'System.Windows.Controls.StackPanel' kann nicht zu einem Objekt vom Typ 'System.Object' hinzugefügt werden. Fehler bei Objekt 'System.Windows.Controls.StackPanel' in Markup-Datei 'NewsCluesWpf; component/processdictionary.xaml' Zeile 31 Position 31. –

+0

Eigentlich funktioniert es für mich ganz gut, keine Fehler ('WPF', '.NET4. 0'). Vielen Dank, Kent! – Fedor

0

Nicht sicher, dass Sie es durch XAML tun.

Ein einfacherer Weg könnte sein, das LoadingRow-Ereignis einfach zu behandeln. In XAML haben so etwas wie:

<dg:DataGrid Name="dgResults" AutoGenerateColumns="True" 
      LoadingRow="dgResults_LoadingRow" 
      ItemsSource="{Binding ListOfStrings}" /> 

Dann im Code hinter

void dgResults_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    DataGridRow row = e.Row; 
    row.ToolTip = row.DataContext as string; 
} 

Offensichtlich müssen Sie den Code ändern, je nachdem, wie Sie die Daten im Datenraster bevölkern. Dies ist auch nicht getestet =)

6

Der Schlüssel ist die Eigenschaft ToolTipService.ToolTip, statt ToolTip zu verwenden - wie folgt aus:

<Setter Property="ToolTipService.ToolTip" Value="My Tooltip"/> 
+0

Arbeitete für mich ohne viel Aufhebens. +1 – heltonbiker

0

ich den Tooltip dynamisch auf den Zellinhalt zu setzen, basierend benötigt. Ich verwende den Tooltip, um Textüberlauftext aus der Zelle anzuzeigen. Die folgende Bindung stammt von einer C# -Klasse-Eigenschaft namens CellText. Danke an die obigen Beiträge, damit ich es vermeiden kann, das ganze Ding selbst herauszufinden.

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

Ich habe auch das mit ein paar Änderungen funktioniert; inklusive falls es jemandem hilft.

Mein Datadrid ist an eine Liste von benutzerdefinierten Objekten gebunden, ich wollte die Zeichenfolge "Name" als eine Spalte und die Zeichenfolge "Text" in der QuickInfo anzeigen. Der Trick für mich (newbe) war, dass ich die Textspalte einschließen und verstecken musste, damit sie im Tooltip angezeigt wird, d.h.:

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