25

我在有限大小的控件中有一个 TextBlock。如果文本太长而无法放入控件,我想显示一个带有全文的工具提示。这是您肯定从许多应用程序中知道的经典行为。

我尝试使用转换器将 TextBlock 宽度转换为工具提示的可见性。

<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 进行比较。

4

3 回答 3

32

我想通了,工具提示具有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 转换为 Visibility 的 Converter(基于 TextBlock 宽度)。

于 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 触发器总是与特定值进行比较,不小于或大于。你可以让它出现,例如,如果宽度 = 100,而不是宽度 < 100。

于 2009-07-12T12:23:16.247 回答