代码之家  ›  专栏  ›  技术社区  ›  Martin Konicek Phil Windley

如果需要,显示WPF工具提示

  •  21
  • Martin Konicek Phil Windley  · 技术社区  · 15 年前

    我在一个有限大小的控件内有一个文本块。如果文本太长,无法放入控件中,我希望显示一个包含全文的工具提示。这是一个典型的行为,你肯定知道从许多应用程序。

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

    <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”是数据绑定项。我希望“value”是文本块,观察它的宽度,并将其与gridviewcolumn.width进行比较。

    3 回复  |  直到 11 年前
        1
  •  30
  •   SliverNinja - MSFT    13 年前

    我知道了,工具提示 胎盘靶 属性,该属性指定具有工具提示的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>
    

    然后编写一个转换器,将文本块转换为可见性(基于文本块宽度)。

        2
  •  4
  •   Martin Konicek Phil Windley    11 年前

    好吧,那为什么要用纯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;
    }
    
        3
  •  0
  •   Yvo    15 年前

    我认为您必须查看一个ControlTemplate触发器来解决这个问题。不幸的是,ControlTemplate触发器总是与特定值(不小于或大于)进行比较。您可以使其显示,例如,如果宽度=100,而不是宽度<100。