Подтвердить что ты не робот

Изменение всплывающей подсказки InitialShowDelay Property Global

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

Мой вопрос: мне нужно пройти через XAML и явно сказать

ToolTipService.InitialShowDelay="2000"

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

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

4b9b3361

Ответ 1

К сожалению, нет простого способа сделать это. В идеале вы должны установить 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}"/>

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

Ответ 2

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

Оба они основаны на системе метаданных 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

Ответ 3

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

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

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

Ответ 4

Решение Nicholas Armstrong очень хорошее, но стиль 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>