25

サイズが制限されたコントロール内に 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, ...

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

4

3 に答える 3

32

Tooltip には、Tooltip を持つ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 を (TextBlock の幅に基づいて) Visibility に変換する Converter を作成します。

于 2009-07-17T11:11:25.130 に答える
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;
}
于 2009-07-12T13:30:09.593 に答える
0

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

于 2009-07-12T12:23:16.247 に答える