2011-11-22 34 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; 
     } 
    } 
    }