最近,我开始使用Silverlight 5.我需要实现为页面上显示的所有控件隐藏工具提示的可能性。
例如,页面包含一组按钮:
<Button Command="{Binding Path=VerifyDocCommand}" ToolTipService.ToolTip="{Binding Source={StaticResource Trans}, Path=ToolTipSaveButton}" CommandParameter="{Binding Path=Documents.CurrentItem, FallbackValue=null}" Style="{StaticResource VerifyButton}"/>
...
我为ToolTip
创建了以下样式:
<navigation:Page.Resources>
<Style TargetType="ToolTip">
<Setter Property="Visibility" Value="{Binding ShowTooltips, Converter={StaticResource BoolToVisibilityConv}}"/>
</Style>
</navigation:Page.Resources>
但即使我使用这种风格,上面按钮的工具提示仍然可见:
<navigation:Page.Resources>
<Style TargetType="ToolTip">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</navigation:Page.Resources>
您能否建议我如何实现此功能?
答案 0 :(得分:1)
我无法找到Silverlight ToolTipService
本身提供的便捷方式。
我可以想到两种可能的解决方案:
第一个解决方案:为您的项目引入一个基本上说明的编码规则:
所有ToolTip Bindings都应使用
SwitchOffConverter
(如果它们的源是DataContext)或者使用SwitchOffTextResources
对象作为其源
使用如下:
<Button
Command="{Binding VerifyDocument}"
ToolTipService.ToolTip="{Binding Path=LocalizedText.VerifyDocument_ToolTip,
Source={StaticResource DeactivatableUiText}}"/>
或
<Button
Command="{Binding VerifyDocument}"
ToolTipService.ToolTip="{Binding Path=VerifyDocument.Description,
Converter={StaticResource ToolTipSwitcher}}"/>
与
<Resources>
<SwitchOffUiTextResources x:Key="DeactivatableUiText"/>
<SwitchOffConverter x:Key="ToolTipSwitcher"/>
</Resources>
和
public static class ToolTipSwitch
{
private static bool s_isToolTipActivated = true;
public static bool IsToolTipActivated
{
get { return s_isToolTipActivated; }
set
{
if (s_isToolTipActivated != value)
{
s_isToolTipActivated = value;
RaiseIsToolTipActivatedChanged();
}
}
}
private static void RaiseIsToolTipActivatedChanged()
{
var handlers = IsToolTipActivatedChanged;
if (handlers != null) handlers();
}
public static event Action IsToolTipActivatedChanged;
}
public class SwitchOffConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ToolTipSwitch.IsToolTipActivated ? value : null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
public class SwitchOffUiTextResources : INotifyPropertyChanged
{
public SwitchOffUiTextResources()
{
ToolTipSwitch.IsToolTipActivatedChanged += OnIsToolTipActivatedChanged;
}
private void OnIsToolTipActivatedChanged()
{
RaisePropertyChanged( "LocalizedText" );
}
private UiTextResources m_localizedText = new UiTextResources();
public UiTextResources LocalizedText
{
get { return ToolTipSwitch.IsToolTipActivated ? m_localizedStrings : null; }
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
第二个解决方案:将您自己的DeactivatableToolTipService
编写为Silverlight ToolTipService
的精简包装,并仅使用您自己的服务。如果停用该服务,只需将所有工具提示设置为null。
我会完全采用第二种方法。
<Button
Command="{Binding VerifyDocument}"
DeactivatableToolTipService.ToolTip="{Binding ...anything...}"/>