Предотвращение пустых всплывающих подсказок в сетке данных wpf - PullRequest
7 голосов
/ 22 ноября 2011

Я работаю над программой календаря, которая состоит в основном из WPF DataGrid. Так как не всегда достаточно места для отображения всех записей дня (то есть DataGridCell), всплывающая подсказка со всеми записями оболочки дня появляется при наведении курсора мыши. Это работает до сих пор с фрагментом кода, показанным ниже. А теперь (маленькая) проблема: если за день нет записей, не появляется всплывающая подсказка. С кодом ниже появляется всплывающая подсказка.

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

в коде позади, где 'Day' - модель представления для отдельной строки календаря.

Ответы [ 4 ]

11 голосов
/ 22 ноября 2011

как H.B. Рекомендуется привязывать напрямую к свойству ToolTip вместо использования TextBlock, и в случае, если AllEntriesText пустая строка, вы можете применить триггер к вашему TextBlock, чтобы отключить всплывающую подсказку, установив свойство ToolTipService.IsEnabled следующим образом -

<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"
4 голосов
/ 22 ноября 2011

Привязать непосредственно к свойству ToolTip (не создавайте для него TextBlock) и установить AllEntriesText на null, если нет записей, тогда сам ToolTip также имеет значение null и не должен отображаться .

2 голосов
/ 25 ноября 2011

Спасибо за решения, они могут работать, без вопросов. Но мне нужен 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>

Я привязал свойство "Visibility" всплывающей подсказки к свойству EntryToolTipVisibility (типа Visibility) в модели представления. См. Фрагмент кода ниже.

public Visibility EntryToolTipVisibility
{ 
    get
    { 
        return _entries.Count > 0 ? Visibility.Visible : Visibility.Collapsed; 
    } 
}
0 голосов
/ 21 января 2014

Другой вариант - использовать собственный конвертер. Я предпочитаю этот способ, например, для всплывающей подсказки 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;
        }
    }
   }
...