2009-07-12 21 views
20

Sınırlı boyutlu bir kontrolün içinde bir TextBlock var. Metin, kontrole sığmayacak kadar uzunsa, tam metin içeren bir araç ipucu göstermek istiyorum. Bu, birçok uygulamadan bildiğiniz klasik bir davranıştır.Gerekirse WPF Araç ipucunu göster

TextBlock genişliğini Tooltip'in Görünürlüğüne dönüştürmek için bir Dönüştürücü kullanmayı denedim.

public object Convert(object value, ... 

'value' veri sınırlama öğedir:

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

sorun Converter olmasıdır. Genişliğini gözlemlemek ve GridViewColumn.Width ile karşılaştırmak için 'değer' TextBlock olmasını isterim.

cevap

28

olayı çözdüm, Tooltip Tooltip vardır UI öğesi belirtir PlacementTarget özelliğine sahiptir.

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

Ve sonra (TextBlock genişliğine göre) Görünürlüğü'ne TextBlock dönüştüren bir dönüştürücü yazmak: Durumda herkes buna ihtiyacı var.

0

Bu sorunu çözmek için bir ControlTemplate tetiğine bakmanız gerektiğini düşünürüm. Ne yazık ki ControlTemplate tetikleyicileri her zaman, en az veya daha büyük olmayan belirli bir değerle karşılaştırır. Bunu ör. Genişlik = 100 ise, Genişlik < 100.

6

Tamam, peki neden bu sadece XAML zorlu yol? Bu çalışır:

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

Control.xaml.cs içinde:

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

Bu, TextTrimming etkinken çalışır mı? Çünkü o zaman TextBlock muhtemelen mevcut olandan daha fazla yer almayacaktır. – ygoe

İlgili konular