【问题标题】:Silverlight DescriptionViewer prevent Tooltip to disappear on clickSilverlight DescriptionViewer 防止工具提示在单击时消失
【发布时间】:2011-04-29 09:14:16
【问题描述】:

Silverlight 4 DescriptionViewer 控件在工具提示中显示 Description

语法非常简单:将命名空间 xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input" 和以下 XAML 添加到您的 UserControl:

<dataInput:DescriptionViewer Description="Some hints on user input etc." />

不幸的是,一些用户单击显示的图标(因为它甚至默认悬停)会立即关闭工具提示(实际且唯一的信息)。更糟糕的是,当你在鼠标悬停后很快点击时,Tooltip 甚至根本不会出现,因此用户可能会认为 Icon 根本没有任何功能。

我想防止在单击时关闭工具提示(只是在“鼠标移出”时关闭),更好的点击应该强制工具提示立即显示(在显示之前跳过通常的超时)。

这似乎比我更难,因为没有OnClick 事件,而且MouseLeftButtonDown 似乎根本没有触发。我还尝试覆盖 DescriptionViewer 控件,但也没有找到合适的方法来覆盖。

你能帮忙吗?谢谢!

【问题讨论】:

    标签: silverlight silverlight-4.0 tooltip silverlight-toolkit


    【解决方案1】:

    这实际上与DescriptionViewer 无关,它是ToolTip 的行为。单击鼠标后,工具提示将消失。在这种情况下,您可能需要编写自己的 ToolTip。

    我认为通常当您单击 DescriptionViewer 图标时,应该会打开一个新窗口,就像一个更详细的帮助页面。这样用户就不会感到困惑了。

    更新:

    您可以通过定义附加属性来实现此目的。基本上,您将此属性附加到您的 DescriptionViewer 内的按钮。当 Button 的 Click 事件被触发时,您会在 Button 下方找到 Tooltip,并将其 IsOpen 设置为 ture。然后,您还需要处理 MouseLeave 事件以在鼠标离开后隐藏 Tooltip。

    这是附加属性的定义方式。

    公共静态类 ButtonAttachedProperties { 公共静态布尔 GetOpenToolTip(DependencyObject obj) { 返回(布尔)obj.GetValue(OpenToolTipProperty); }

    public static void SetOpenToolTip(DependencyObject obj, bool value)
    {
        obj.SetValue(OpenToolTipProperty, value);
    }
    
    public static readonly DependencyProperty OpenToolTipProperty =
        DependencyProperty.RegisterAttached("OpenToolTip", typeof(bool), typeof(ButtonAttachedProperties), new PropertyMetadata(false, Callback));
    
    
    private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var button = d as Button;
    
        if (button == null || !(bool)e.NewValue) return;
    
        button.Click += (s, e1) =>
        {
            var tooltip = button.FindName("MyToolTip") as ToolTip;
    
            if (tooltip != null)
            {
                tooltip.PlacementTarget = button;
                tooltip.IsOpen = true;      
            }
        };
    
        button.MouseLeave += (s, e2) =>
        {
            var tooltip = button.FindName("MyToolTip") as ToolTip;
    
            if (tooltip != null)
                tooltip.IsOpen = false;
        };
    }
    

    }

    然后在 DescriptionViewer 的样式中,将属性附加到 Button。此外,您需要为 Tooltip 命名,以便能够使用附加属性类中的 FindName 找到它。

                            <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Height="{TemplateBinding Height}" Padding="{TemplateBinding Padding}" Width="{TemplateBinding Width}">
                                <Button x:Name="DescriptionContent" local:ButtonAttachedProperties.OpenToolTip="True" BorderBrush="#FFFFFFFF" BorderThickness="1" Background="#00000000" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsTabStop="False" Padding="1" Template="{TemplateBinding GlyphTemplate}" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                    <ToolTipService.ToolTip>
                                        <ToolTip x:Name="MyToolTip" Content="{TemplateBinding Description}" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Style="{TemplateBinding ToolTipStyle}"/>
                                    </ToolTipService.ToolTip>
                                </Button>
                            </Border>
    

    希望这会有所帮助。 :)

    【讨论】:

    • “应该有一个新窗口打开,就像一个更详细的帮助页面” - 是的,为什么不这样做,但我仍然无法处理鼠标点击来做到这一点。看来我应该编写自己的 DescriptionViewer。
    • 如果您只想点击鼠标,那很容易。您可以编辑描述查看器的默认样式并在模板中找到一个名为 DescriptionContent 的按钮并从那里处理其 Click 事件。
    • 好的,我理解这背后的概念,但我实际上并不觉得以优雅、可重用的方式做到这一点很容易 :)
    • 是的,如果您希望它是通用的,那么它需要更多的工作。请参阅我更新的答案。 :)
    • 太好了,成功了!但是您不认为取消订阅ClickMouseLeave 事件会很好吗?您如何看待订阅“button.Unloaded”、将鼠标事件从 lambda 更改为常规处理程序并在“button.Unloaded”发生时取消订阅所有三个事件(Unloaded/Click/MouseLeave)?好主意?还是有更好的地方来做这件事,或者这甚至没有必要?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多