2009-07-12 23 views
20

私は、制限されたサイズのコントロールの中にTextBlockを持っています。テキストが長すぎてコントロールに収まらない場合は、フルテキストのツールチップを表示したいと思います。これは多くのアプリからはっきりと分かっている典型的な動作です。必要に応じてWPFツールチップを表示

Converterを使ってTextBlockの幅をツールチップのVisibilityに変換しようとしました。

public object Convert(object value, ... 

'価値' データバインド項目である:

​​

問題はコンバータであることです。私は 'value'をTextBlockにし、その幅を観察し、それをGridViewColumn.Widthと比較したいと思います。

答えて

28

が、私はそれを考え出し、ツールチップは、ツールチップを持っているUI要素を指定PlacementTarget性質を有しています。誰でもそれが必要な場合:

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

次に、TextBlockをVisibility(TextBlockの幅に基づいて)に変換するコンバータを作成します。

0

この問題を解決するには、ControlTemplateトリガーを見なければならないと思います。残念ながら、ControlTemplateのトリガーは、常に、特定の値と比較されます。例:幅= 100、幅でない場合< 100.

6

なぜ、ハードXAMLのみの方法ですか?これは動作します:

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

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

TextTrimmingを有効にしても動作しますか? TextBlockはおそらくそれ以上のスペースを取らないためです。 – ygoe

関連する問題