我正在制作一个日历程序,主要由WPF DataGrid
组成。由于并不总是有足够的空间来显示一天中的所有条目(DataGridCell
),因此鼠标悬停时会显示包含日期shell的所有条目的工具提示。到目前为止,这可以使用下面显示的代码片段。现在(小)问题:如果一天没有条目,则不会弹出工具提示shell。使用下面的代码,弹出一个空的工具提示。
<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'是单个日历行的视图模型。
答案 0 :(得分:11)
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"
答案 1 :(得分:4)
直接绑定到ToolTip
属性(不要为它创建TextBlock
)并将AllEntriesText
设置为null
如果没有条目,则{{1本身也是null,不应该显示。
答案 2 :(得分: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>
我将工具提示的属性“可见性”绑定到视图模型中的属性“EntryToolTipVisibility”(可见性类型)。请参阅下面的代码段。
public Visibility EntryToolTipVisibility
{
get
{
return _entries.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
}
}
答案 3 :(得分: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;
}
}
}