2009-07-12 14 views
20

Tengo un TextBlock dentro de un control de tamaño limitado. Si el texto es demasiado largo para caber en el control, me gustaría mostrar una información sobre herramientas con texto completo. Este es un comportamiento clásico que seguramente conoces de muchas aplicaciones.Mostrar WPF Información sobre la herramienta si es necesario

He intentado utilizar un convertidor para convertir la anchura TextBlock en Visibilidad de Información sobre la herramienta.

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

El problema es que en el convertidor:

public object Convert(object value, ... 

'valor' es el elemento DataBound. Me gustaría que el 'valor' sea el TextBlock, para observar su ancho y compararlo con el GridViewColumn.Width.

Respuesta

28

lo he descubierto, la descripción se PlacementTarget propiedad que especifica el elemento de interfaz de usuario que tiene la información sobre herramientas. En caso de que alguien lo necesita:

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

y luego escribir un convertidor que convierte a TextBlock Visibilidad (basado en el ancho TextBlock).

0

yo creo que hay que mirar a un disparador ControlTemplate para resolver este problema. Lamentablemente, los disparadores de ControlTemplate siempre se comparan con un valor específico, no menor o mayor que. Puede hacer que aparezca, p. Si el ancho = 100, no 100. Ancho <

6

Ok, ¿por qué hacerlo de la manera XAML sólo dura? Esto funciona:

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

en 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

es que esto funciona con TextTrimming permitido? Porque entonces el TextBlock probablemente no ocupe más espacio de lo que está disponible para él. – ygoe

Cuestiones relacionadas