2011-11-22 7 views
6

Estoy trabajando en un programa de calendario, que consiste principalmente en un WPF DataGrid. Como no siempre hay espacio suficiente para mostrar todas las entradas de un día (que es DataGridCell), aparece una información sobre herramientas con todas las entradas del shell del día al pasar el mouse. Esto funciona hasta ahora con el fragmento de código que se muestra a continuación. Y ahora el (pequeño) problema: si no hay entradas para un día, no aparece el cuadro emergente de información sobre herramientas. Con el código a continuación aparece una información sobre herramientas vacía.Impedir información sobre herramientas vacía en una cuadrícula de datos 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> 

El enlace de datos se realiza a través

myCalDataGrid.Itemssource = _listOfDays; 

en código detrás, donde un 'día' es el modelo de vista de una sola fila de calendario.

Respuesta

11

Como H.B. se unen sugerido directamente a la propiedad sobre herramientas en lugar de utilizar TextBlock y en caso AllEntriesText es una cadena vacía se puede aplicar un disparador en su TextBlock que deshabilitar su información sobre herramientas estableciendo la propiedad ToolTipService.IsEnabled como esto -

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

Asegúrese de añadir espacio de nombres sistema en su xaml -

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

Gracias por la respuesta. Lo verificaré y daré un informe. – TheCalendarProgrammer

+1

Buena respuesta, funciona como un encanto. – Mark

4

se unen directamente a la propiedad ToolTip (no crear un TextBlock para ella) y establecer AllEntriesText a null si no hay entradas, entonces el ToolTip en sí también es nulo y no deberán presentar.

2

Gracias por las soluciones, pueden funcionar, no hay duda. Pero necesito un TextBlock para la información sobre herramientas para formatear y alinear el texto. Así que encontré esta solución:

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

I unido al propertie "visibilidad" de información sobre herramientas a un "EntryToolTipVisibility" propertie (de tipo Visibilidad) en el modelo de vista. Vea el fragmento de código a continuación.

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

Otra opción es utilizar un convertidor propio. Prefiero esta manera, por ejemplo, para una información sobre herramientas de TextBlock que muestra el texto de TextBlock, pero para el caso en que no hay texto, la información sobre herramientas vacía no es deseada.

código 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> 

Y código detrás

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