防止wpf数据网格中的空工具提示

时间:2011-11-22 17:18:18

标签: wpf datagrid tooltip

我正在制作一个日历程序,主要由WPF DataGrid组成。由于并不总是有足够的空间来显示一天中的所有条目(DataGridCell),因此鼠标悬停时会显示包含日期shell的所有条目的工具提示。到目前为止,这可以使用下面显示的代码片段。现在(小)问题:如果一天没有条目,则不会弹出工具提示shell。使用下面的代码,弹出一个空的工具提示。

<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 个答案:

答案 0 :(得分:11)

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中添加命名空间系统 -

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

   <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”(可见性类型)。请参阅下面的代码段。

public Visibility EntryToolTipVisibility
{ 
    get
    { 
        return _entries.Count > 0 ? Visibility.Visible : Visibility.Collapsed; 
    } 
}

答案 3 :(得分:0)

另一种选择是使用自己的转换器。 我更喜欢这种方式,例如显示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;
        }
    }
   }