2011-11-22 29 views
6

Tôi đang làm việc trên một chương trình lịch, bao gồm chủ yếu là một WPF DataGrid. Vì không phải lúc nào cũng đủ không gian để hiển thị tất cả các mục trong một ngày (là DataGridCell), một chú giải công cụ với tất cả các mục nhập của vỏ ngày xuất hiện khi di chuột qua. Điều này hoạt động cho đến nay với đoạn mã được hiển thị bên dưới. Và bây giờ vấn đề (nhỏ): Nếu không có mục nào trong một ngày, không có khung công cụ nào xuất hiện. Với mã bên dưới, một tooltip trống sẽ xuất hiện.Ngăn chặn các chú giải công cụ trống tại một sơ đồ dữ liệu 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> 

Các Databinding được thực hiện thông qua

myCalDataGrid.Itemssource = _listOfDays; 

trong mã phía sau, nơi một 'Day' là mô hình điểm cho một hàng lịch duy nhất.

Trả lời

11

Như H.B. gợi ý ràng buộc trực tiếp đến tài sản ToolTip thay vì sử dụng TextBlock và trong trường hợp AllEntriesText là chuỗi rỗng, bạn có thể áp dụng một kích hoạt trên TextBlock của bạn để tắt tooltip của bạn bằng cách thiết lập thuộc tính ToolTipService.IsEnabled như thế này -

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

Hãy chắc chắn để thêm namespace hệ thống trong xaml của bạn -

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

Cảm ơn cho câu trả lời. Tôi sẽ kiểm tra nó và đưa ra một báo cáo. – TheCalendarProgrammer

+1

Câu trả lời hay, hoạt động như một sự quyến rũ. – Mark

4

Bind trực tiếp đến ToolTip tài sản (không tạo ra một TextBlock cho nó) và thiết lập AllEntriesText để null nếu không có mục, thì ToolTip bản thân cũng là null và không nên hiển thị.

2

Cảm ơn các giải pháp, chúng có thể hoạt động, không có câu hỏi. Nhưng tôi cần một TextBlock cho chú giải công cụ để định dạng và căn chỉnh văn bản. Vì vậy, tôi tìm thấy giải pháp này:

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

tôi bị ràng buộc các propertie "Tầm nhìn" của tooltip để một propertie "EntryToolTipVisibility" (kiểu Tầm nhìn) trong mô hình xem. Xem đoạn mã bên dưới.

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

Một tùy chọn khác là sử dụng Trình chuyển đổi riêng. Tôi thích cách này ví dụ cho một chú giải công cụ TextBlock hiển thị văn bản của TextBlock, nhưng đối với trường hợp không có văn bản thì chú giải công cụ trống không được mong muốn.

mã 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> 

Và mã sau

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; 
     } 
    } 
    } 
Các vấn đề liên quan