制限されたサイズのコントロール内に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と比較したいと思います。
私はそれを理解しました、ツールチップには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の幅に基づいて)可視性に変換するコンバーターを記述します。
それでは、なぜ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;
}
この問題を解決するには、ControlTemplateトリガーを確認する必要があると思います。残念ながら、ControlTemplateトリガーは常に、特定の値と比較されます。表示させることができます。幅= 100の場合、幅<100ではありません。