web-dev-qa-db-ja.com

必要に応じてWPFツールチップを表示

制限されたサイズのコントロール内にTextBlockがあります。テキストが長すぎてコントロールに収まらない場合は、フルテキストのツールチップを表示します。これは、多くのアプリで確かに知っている古典的な動作です。

Converterを使用してTextBlockの幅をTooltipのVisibilityに変換してみました。

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

問題は、コンバーター内の問題です。

public object Convert(object value, ...

'value'はDataBoundアイテムです。 「値」をTextBlockにして、その幅を観察し、それをGridViewColumn.Widthと比較したいと思います。

23
Martin Konicek

私はそれを理解しました、ツールチップにはPlacementTargetプロパティがあり、ツールチップを持つUI要素を指定しています。誰かがそれを必要とする場合:

<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を(TextBlockの幅に基づいて)可視性に変換するコンバーターを記述します。

32
Martin Konicek

それでは、なぜ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;
}
5
Martin Konicek

この問題を解決するには、ControlTemplateトリガーを確認する必要があると思います。残念ながら、ControlTemplateトリガーは常に、特定の値と比較されます。表示させることができます。幅= 100の場合、幅<100ではありません。

0
Zyphrax