Изменение всплывающей подсказки InitialShowDelay Property Global
У меня есть приложение, которое имеет более сотни различных подсказок, установленных на элементе управления ленты. Все всплывающие подсказки появляются довольно быстро (примерно полсекунды), и я хотел бы увеличить задержку всплывающих окон. После некоторых исследований, похоже, единственный способ сделать это в WPF - это свойство ToolTipService.InitialShowDelay.
Мой вопрос: мне нужно пройти через XAML и явно сказать
ToolTipService.InitialShowDelay="2000"
Для каждого элемента управления, имеющего всплывающую подсказку? Или есть способ установить это свойство во всем мире, используя что-то вроде стиля?
Спасибо за любые идеи.
Ответы
Ответ 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>