Измените свойство ToolTip InitialShowDelay глобально - PullRequest
18 голосов
/ 05 июня 2009

У меня есть приложение с сотней различных всплывающих подсказок, установленных на элементе управления ленты. Все всплывающие подсказки всплывают довольно быстро (около полсекунды), и я хотел бы увеличить задержку всплывающих окон. После некоторых исследований кажется, что единственный способ сделать это в WPF - через свойство ToolTipService.InitialShowDelay.

У меня вопрос, должен ли я пройти через XAML и явно сказать

ToolTipService.InitialShowDelay="2000"

Для каждого элемента управления, который имеет всплывающую подсказку? Или есть какой-то способ установить это свойство глобально, используя что-то вроде стиля?

Спасибо за любые идеи.

Ответы [ 4 ]

25 голосов
/ 05 июня 2009

К сожалению, нет простого способа сделать это. В идеале вы должны установить ToolTipService.InitialShowDelay на FrameworkElement и позволить ему распространяться оттуда, но оказывается, что это не работает.

Вместо этого вы можете установить его для каждого типа элемента управления, на который вы хотите установить его, например:

<Style TargetType="RibbonButton">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>
<Style TargetType="RibbonToggleButton">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>
<Style TargetType="RibbonDropDownButton">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>

и т.д.

Хотя это довольно многословный способ сделать это, по крайней мере, вам нужно установить его только для каждого типа элемента управления, а не для каждого элемента управления - и если вы используете его в ленте, то есть только несколько управления для начала.

Чтобы избавить себя от хлопот, если вам захочется изменить значение, вы можете сконструировать приведенный выше код, используя значение ресурса:

<sys:Int32 x:Key="ToolTipInitialShowDelay">2000</sys:Int32>
<Style TargetType="RibbonButton">
    <Setter Property="ToolTipService.InitialShowDelay" 
            Value="{StaticResource ToolTipInitialShowDelay}"/>
</Style>
<Style TargetType="RibbonToggleButton">
    <Setter Property="ToolTipService.InitialShowDelay" 
            Value="{StaticResource ToolTipInitialShowDelay}"/>
</Style>
<Style TargetType="RibbonDropDownButton">
    <Setter Property="ToolTipService.InitialShowDelay" 
            Value="{StaticResource ToolTipInitialShowDelay}"/>
</Style>

В качестве альтернативы, если вы еще не используете стили BasedOn, вы можете сократить его до:

<Style x:Key="ToolTipDefaults">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>
<Style TargetType="RibbonButton" BasedOn="{StaticResource ToolTipDefaults}"/>
<Style TargetType="RibbonToggleButton" BasedOn="{StaticResource ToolTipDefaults}"/>
<Style TargetType="RibbonDropDownButton" BasedOn="{StaticResource ToolTipDefaults}"/>

Ограничением этого подхода является то, что стиль может быть основан только на одном родительском стиле, поэтому, если вы уже используете этот шаблон, вы не сможете это сделать.

12 голосов
/ 26 октября 2009

Я столкнулся с той же проблемой и достиг заметного решения. На самом деле два из них.

Оба они основаны на системе метаданных DependencyProperty. Для них обоих вам понадобится довольно похожий код статической инициализации:

public static class ToolTipServiceHelper
{
    static ToolTipServiceHelper()
    {
        ToolTipService.InitialShowDelayProperty
            .OverrideMetadata(typeof(FrameworkElement), 
                              new FrameworkPropertyMetadata(...));
    }
}

Что идет вместо "..."?

Первое решение довольно очевидно: поместите туда желаемое значение по умолчанию, которое будет применяться ко всему приложению, кроме мест, где предоставляется фактическое значение.

Второе решение является хитрым: вместо «...» вы предоставляете значение по умолчанию из метаданных по умолчанию, но помимо этого вы меняете параметры, фактически вы должны сделать свойство наследуемым.

new FrameworkPropertyMetadata(
    ToolTipService.InitialShowDelayProperty.DefaultMetadata.DefaultValue,
    FrameworkPropertyMetadataOptions.Inherits)

Когда свойство наследуемо, вы можете сделать такие вещи:

<Window xmlns="..."
        ...
        ToolTipService.InitialShowDelay="2000">
    ...
</Window>

Это сделает трюк для всего окна или любого другого элемента, к которому вы применяете свойство.

HTH

8 голосов
/ 24 января 2011

Мне нравится решение archimed7592, но оно не будет работать само по себе. Вам нужно как-то использовать класс, чтобы запустить его статический конструктор. Поэтому я решил поместить этот код в статический конструктор класса приложения моего приложения следующим образом:

    static NetFriendApplication()
    {
        ToolTipService.ShowDurationProperty.OverrideMetadata(
            typeof (FrameworkElement), new FrameworkPropertyMetadata(int.MaxValue));
    }

И в моем случае мне нужно установить другое свойство, но идея та же. Так что не будь любопытным.

3 голосов
/ 11 июля 2014

Решение Николаса Армстронга очень хорошее, но стилизация FrameworkElement работает, если для ToolTipService.IsEnabled установлено значение true.

В моем проекте у меня есть стиль commom для каждого поля, и установка ToolTip.InitialDelay была разумной вещью, и она не работала, поэтому я попробовал ToolTip.IsEnabled, и она сработала.

Пример ниже:

<Style x:Key="FieldStyle" TargetType="FrameworkElement">
    <Setter Property="ToolTipService.ShowOnDisabled" Value="True"/>
    <Setter Property="ToolTipService.ShowDuration" Value="20000"/>
    <Setter Property="ToolTipService.InitialShowDelay" Value="3000"/>
    <Setter Property="ToolTipService.IsEnabled" Value="True"/>
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...