2009-07-12 17 views
20

Ho un TextBlock all'interno di un controllo di dimensioni limitate. Se il testo è troppo lungo per adattarsi al controllo, mi piacerebbe mostrare un suggerimento con testo completo. Questo è un comportamento classico che sicuramente conosci da molte app.Mostra suggerimento WPF se necessario

Ho provato a utilizzare un convertitore per convertire la larghezza di TextBlock in Visibilità di Tooltip.

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

Il problema è che nel Convertitore:

public object Convert(object value, ... 

'valore' è l'elemento DataBound. Mi piacerebbe che il 'valore' fosse TextBlock, per osservarne la larghezza e confrontarlo con GridViewColumn.Width.

risposta

28

ho capito, il Tooltip ha PlacementTarget proprietà che specifica l'elemento dell'interfaccia utente che ha il Tooltip. Nel caso in cui qualcuno ha bisogno di esso:

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

e poi scrivere un convertitore che converte TextBlock di visibilità (in base alla larghezza TextBlock).

0

Penso che sia necessario controllare un trigger ControlTemplate per risolvere questo problema. Sfortunatamente i trigger di ControlTemplate sono sempre confrontati con un valore specifico, non inferiore o superiore a. Puoi farlo apparire ad es. se Larghezza = 100, non Larghezza < 100.

6

Ok, allora perché utilizzare XAML? Questo funziona:

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

in 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

Funzionerà con TextTrimming attivato? Perché quindi TextBlock probabilmente non occuperà più spazio di quello disponibile per esso. – ygoe

Problemi correlati