2009-07-12 11 views
20

J'ai un TextBlock dans un contrôle de taille limitée. Si le texte est trop long pour tenir dans le contrôle, je voudrais montrer une info-bulle avec texte intégral. C'est un comportement classique que vous connaissez sûrement de nombreuses applications.Afficher l'info-bulle WPF si nécessaire

J'ai essayé d'utiliser un convertisseur pour convertir la largeur de TextBlock en visibilité de l'info-bulle.

<GridViewColumn.CellTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Text}"> 
      <TextBlock.ToolTip> 
       <ToolTip 
        DataContext="{TemplateBinding Content}" 
        Visibility="{Binding Converter={StaticResource visConvert}}"> 

         <TextBlock Text="{Binding Text}"></TextBlock> 
       </ToolTip> 
      </TextBlock.ToolTip> 
     </TextBlock> 
    </DataTemplate> 
</GridViewColumn.CellTemplate> 

Le problème est que dans le convertisseur:

public object Convert(object value, ... 

'valeur' ​​est l'élément DataBound. Je voudrais que la "valeur" soit le TextBlock, pour observer sa largeur, et le comparer à la GridViewColumn.Width.

Répondre

28

I figured it out, l'info-bulle a PlacementTarget propriété qui spécifie l'élément d'interface utilisateur qui a l'info-bulle. Dans le cas où tout le monde a besoin:

<TextBlock Text="{Binding Text}"> 
    <TextBlock.ToolTip> 
     <ToolTip 
      DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}" 
      Visibility="{Binding Converter={StaticResource toolVisConverter}}"> 
      <TextBlock Text="{Binding Text}"/> <!-- tooltip content --> 
     </ToolTip> 
    </TextBlock.ToolTip> 
</TextBlock> 

Et puis écrire un convertisseur qui convertit TextBlock Visibilité (fonction de la largeur TextBlock).

0

Je pense que vous devez regarder un déclencheur ControlTemplate pour résoudre ce problème. Malheureusement, les déclencheurs ControlTemplate se comparent toujours à une valeur spécifique, non inférieure ou supérieure à. Vous pouvez le faire apparaître par ex. si la Largeur = 100, pas la Largeur < 100.

6

Ok, alors pourquoi est-ce que c'est la méthode XAML seulement? Cela fonctionne:

<TextBlock Text="{Binding Text}" 
    IsMouseDirectlyOverChanged="TextBlock_IsMouseDirectlyOverChanged" > 
    <TextBlock.ToolTip> 
    <ToolTip Visibility="Collapsed"> 
     <TextBlock Text="{Binding Text}"></TextBlock> 
    </ToolTip> 
    </TextBlock.ToolTip> 
</TextBlock> 

dans Control.xaml.cs:

private void TextBlock_IsMouseDirectlyOverChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    bool isMouseOver = (bool)e.NewValue; 
    if (!isMouseOver) 
     return; 
    TextBlock textBlock = (TextBlock)sender; 
    bool needed = textBlock.ActualWidth > 
     (this.listView.View as GridView).Columns[2].ActualWidth; 
    ((ToolTip)textBlock.ToolTip).Visibility = 
     needed ? Visibility.Visible : Visibility.Collapsed; 
} 
+0

Est-ce que cela fonctionnera avec TextTrimming activé? Parce que le TextBlock ne prendra probablement pas plus d'espace que ce qui est disponible pour cela. – ygoe

Questions connexes