2011-11-22 3 views
6

Sto lavorando a un programma di calendario, costituito principalmente da un WPF DataGrid. Poiché non c'è sempre abbastanza spazio per visualizzare tutte le voci di un giorno (che è un DataGridCell), una descrizione con tutte le voci della shell del giorno appare al passaggio del mouse. Questo funziona fino ad ora con il frammento di codice mostrato di seguito. E ora il (piccolo) problema: se non ci sono voci per un giorno, non viene visualizzata alcuna descrizione del tooltip. Con il codice sottostante viene visualizzato un suggerimento vuoto.Prevent tooltips vuoti in un datagide 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> 

Il Databinding è realizzato tramite

myCalDataGrid.Itemssource = _listOfDays; 

in codice dietro, dove un 'giorno' è il modello vista per una singola riga del calendario.

risposta

11

Come H.B. legano suggerito direttamente alla proprietà ToolTip invece di usare TextBlock e nel caso in cui AllEntriesText è stringa vuota è possibile applicare un trigger sul TextBlock per disattivare il tooltip impostando la proprietà ToolTipService.IsEnabled come questo -

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

Assicurarsi di aggiungere namespace sistema nel vostro XAML -

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

Grazie per la risposta. Lo controllerò e avrò un rapporto. – TheCalendarProgrammer

+1

Buona risposta, funziona come un fascino. – Mark

4

Bind direttamente alla proprietà ToolTip (non creare un TextBlock per esso) e impostare AllEntriesText a null se non esistono voci, quindi il ToolTip stesso è anche nullo e non dovrebbe mostrare.

2

Grazie per le soluzioni, possono lavorare, non c'è dubbio. Ma ho bisogno di un TextBlock per il tooltip per formattare e allineare il testo. Così ho trovato questa soluzione:

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

ho legato il propertie "visibilità" di tooltip ad un "EntryToolTipVisibility" Proprieta (di tipo visibilità) nel modello di visualizzazione. Vedi lo snippet di codice qui sotto.

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

Un'altra opzione è quella di utilizzare un proprio convertitore. Preferisco in questo modo, ad esempio, un suggerimento TextBlock che visualizza il testo di TextBlock, ma per il caso non c'è testo, il tooltip vuoto non è desiderato.

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

E codice dietro

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