2011-11-22 98 views
6

我正在研究一个日历程序,它主要由WPF DataGrid组成。由于没有足够的空间来显示一天中的所有条目(这是一个DataGridCell),包含day shell全部条目的工具提示出现在鼠标悬停处。这到目前为止工作与下面的代码片段。现在(小)问题:如果一天没有条目,则不会弹出工具提示框。用下面的代码弹出一个空的工具提示。防止wpf数据网格空工具提示

<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; 

在代码所做的后面,其中,A“日”为单个日历行视图模型。

回答

11

正如H.B.建议直接绑定到工具提示属性,而不是使用的TextBlock和情况AllEntriesText是空字符串,你可以通过设置属性ToolTipService.IsEnabled这样对你的TextBlock应用触发禁用工具提示 -

<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" 
+0

感谢您的回答。我会检查一下并发送一份报告。 – TheCalendarProgrammer

+1

好答案,像魅力一样工作。 – Mark

4

直接绑定到ToolTip财产(不为它创建一个TextBlock),并设置AllEntriesTextnull如果没有条目,那么ToolTip本身也是无效和不应该显示。

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> 

我结合工具提示的propertie的“可见性”发送给propertie“EntryToolTipVisibility”(类型能见度的)在视图模型。查看下面的代码片段。

public Visibility EntryToolTipVisibility 
{ 
    get 
    { 
     return _entries.Count > 0 ? Visibility.Visible : Visibility.Collapsed; 
    } 
} 
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; 
     } 
    } 
    }