Silverlight DescriptionViewer предотвращает исчезновение всплывающей подсказки при нажатии - PullRequest
0 голосов
/ 29 апреля 2011

Элемент управления 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." />

К сожалению, некоторые пользователи щелкают по отображаемому значку (поскольку он даже зависает по умолчанию), который мгновенно закрывает всплывающую подсказку (актуальная и единственная информация).Хуже того, когда вы нажимаете очень быстро после наведения мыши, всплывающая подсказка даже не появляется вообще, поэтому пользователь может подумать, что значок вообще не работает.

Я бы хотел запретить закрывать подсказку наНажмите (просто закройте «мышь»), еще лучше, щелчок должен заставить подсказку показываться немедленно (пропуская обычный тайм-аут перед показанным).

Кажется, что это сложнее, чем я, так как нет OnClick событие, а также MouseLeftButtonDown, похоже, вообще не сработало.Я также пытался переопределить элемент управления DescriptionViewer, но также не смог найти подходящие методы для переопределения.

Вы можете помочь?Спасибо!

1 Ответ

1 голос
/ 29 апреля 2011

это на самом деле не имеет ничего общего с DescriptionViewer, это поведение всплывающей подсказки. Всплывающая подсказка исчезнет, ​​как только вы нажмете кнопку мыши. В этом случае вы можете написать свою собственную подсказку.

Я думаю, что обычно, когда вы нажимаете на иконку DescriptionViewer, должно открываться новое окно, похожее на более подробную справочную страницу. Так что пользователь не запутается.

Обновление:

Этого можно достичь, определив прикрепленное свойство. По сути, вы прикрепляете это свойство к кнопке внутри вашего DescriptionViewer. Когда вызывается событие Click кнопки, вы находите подсказку под кнопкой и устанавливаете ее IsOpen в значение ture. Затем вам также нужно обработать событие MouseLeave, чтобы скрыть всплывающую подсказку, как только мышь исчезнет.

Так определяется прикрепленное свойство.

открытый статический класс ButtonAttachedProperties { public static bool GetOpenToolTip (DependencyObject obj) { return (bool) 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 вы присоединяете свойство к кнопке. Также вам нужно дать имя всплывающей подсказке, чтобы найти его с помощью FindName в классе свойства attach.

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

Надеюсь, это поможет. :)

...