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

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

  •  26
  • Martin Konicek Phil Windley  · 技术社区  · 17 年前

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

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

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

    3 回复  |  直到 17 年前
        1
  •  30
  •   SliverNinja - MSFT    14 年前

    地点目标 属性,指定具有工具提示的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    12 年前

    <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    17 年前

    我认为您必须查看ControlTemplate触发器来解决这个问题。不幸的是,ControlTemplate触发器总是与特定值进行比较,该值不得小于或大于。例如,如果宽度=100,而不是宽度< 100.

    推荐文章