防止WPF DataGrid中出现空的工具提示

8

我正在开发一个日历程序,主要由WPF DataGrid组成。由于有时候没有足够的空间来显示一天中所有的条目(也就是DataGridCell),当鼠标悬停时会出现一个包含该日所有条目的提示框。下面的代码片段可以实现这个功能。但是现在有一个小问题:如果某天没有条目,则不会弹出提示框。使用下面的代码会弹出一个空提示框。

<DataGridTemplateColumn x:Name="Entry" 
                        IsReadOnly="True">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Grid>
        <TextBlock Text="{Binding EntryText}"
                   Foreground="{Binding EntryForeground}"
                   FontWeight="{Binding EntryFontWeight}">
        </TextBlock>
        <TextBlock Text="{Binding RightAlignedText}"
                   Foreground="Gray"    
                   Background="Transparent">
          <TextBlock.ToolTip>
            <TextBlock Text="{Binding AllEntriesText}"/>
          </TextBlock.ToolTip>
        </TextBlock>
      </Grid>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

数据绑定是通过 {{}} 实现的。
myCalDataGrid.Itemssource = _listOfDays; 

在代码后台,其中“Day”是单个日历行的视图模型。
4个回答

12

如H.B.所建议的那样,直接绑定到ToolTip属性,而不是使用TextBlock。如果AllEntriesText是空字符串,您可以在TextBlock上应用触发器以通过设置ToolTipService.IsEnabled属性来禁用您的工具提示,如下所示 -

<TextBlock Text="{Binding RightAlignedText}"
           Foreground="Gray"    
           Background="Transparent"
           ToolTip="{Binding AllEntriesText}">
   <TextBlock.Style>
      <Style TargetType="TextBlock">
         <Style.Triggers>
            <Trigger Property="ToolTip"
                     Value="{x:Static system:String.Empty}">
               <Setter Property="ToolTipService.IsEnabled" Value="False" />
            </Trigger>
         </Style.Triggers>
       </Style>
    </TextBlock.Style>
</TextBlock>

确保在您的XAML中添加命名空间system -

xmlns:system="clr-namespace:System;assembly=mscorlib"

谢谢你的回答。我会去查看并提交报告。 - TheCalendarProgrammer

4

直接绑定到ToolTip属性(不要为其创建TextBlock),如果没有条目,则将AllEntriesText设置为null,那么ToolTip本身也为null,不应该显示。


2

感谢您提供的解决方案,它们可能有效,毫无疑问。但我需要一个文本块来为工具提示格式化和对齐文本。因此,我找到了以下解决方案:

   <TextBlock Text="{Binding RightAlignedText}"
            HorizontalAlignment="Stretch"
            TextAlignment="Right" Padding="2,0"
            Foreground="Gray"    
            Background="Transparent"
            ToolTipService.ShowDuration="60000"
            ToolTipService.BetweenShowDelay="0"
            ToolTipService.InitialShowDelay="0"
            >
        <TextBlock.ToolTip>
            <ToolTip Visibility="{Binding EntryToolTipVisibility}">
                <TextBlock Text="{Binding ToolTipText}" 
                            TextAlignment="Left"
                            FontFamily="Courier New"/>
            </ToolTip>
        </TextBlock.ToolTip>

    </TextBlock>

我将视图模型中的属性"EntryToolTipVisibility"(类型为Visibility)与工具提示的属性"Visibility"绑定在一起。请参见下面的代码片段。
public Visibility EntryToolTipVisibility
{ 
    get
    { 
        return _entries.Count > 0 ? Visibility.Visible : Visibility.Collapsed; 
    } 
}

1
另一种选择是使用自己的转换器。 例如,我更喜欢用于TextBlock工具提示的方式,它显示TextBlock的文本,但如果没有文本,则不希望显示空的工具提示。
XAML代码:
//step #1
xmlns:local="clr-namespace:MyNamespace"

//step #2 - into Window.Resources or other
<local:StringToVisibleTooltip x:Key="StringToVis" />


//step #3 - example of use
<TextBlock ...other attributes... TextTrimming="CharacterEllipsis">                                                        
    <TextBlock.ToolTip>
            <ToolTip Visibility="{Binding Path=Text, Converter={StaticResource StringToVis}}">
                    <TextBlock Text="{Binding Text}"/>                                
                </ToolTip>
        </TextBlock.ToolTip>
</TextBlock>

和代码后台

  namespace MyNamespace
  {
    public class StringToVisibleTooltip : IValueConverter
    {

        public StringToVisibleTooltip() { }

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null && ((string)value).Length > 0) //empty string does not need tooltip
                return Visibility.Visible;
            else
                return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
             return null;
        }
    }
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接