隐藏所有页面控件Silverlight的工具提示

时间:2015-02-24 11:52:26

标签: c# xaml silverlight

最近,我开始使用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>

您能否建议我如何实现此功能?

1 个答案:

答案 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...}"/>