ToolTipService и Popup
97WPF --- Элементы управления WPF --- ToolTipService и Popup
Настройка свойств ToolTipService
Существуют свойства всплывающих подсказок, которые нельзя задать с помощью свойств класса ToolTip. Для этого предназначен другой класс — ToolTipService. Он позволяет задать длительность задержек при отображении всплывающей подсказки.
Все свойства этого класса являются прикрепленными свойствами, поэтому их можно указывать прямо в дескрипторе элемента управления, как показано ниже:
<Button ToolTipService.InitialShowDelay="1">
</Button>
Класс ToolTipService определяет много тех же свойств, что и класс ToolTip. А это значит, что при работе со всплывающими подсказками, содержащими только текст, можно использовать более простой синтаксис. Вместо добавления вложенного элемента ToolTip, можно задать все, что необходимо, с помощью атрибутов.
- InitialShowDelay
Задает задержку (в миллисекундах) перед выводом подсказки после наведения указателя мыши на элемент
- ShowDuration
Задает время (в миллисекундах), в течение которого будет отображаться подсказка, если пользователь не сдвинет указатель мыши
- BetweenShowDelay
Задает временной интервал (в миллисекундах), в течение которого пользователь может переходить от одной всплывающей подсказки к другой без задержки, определяемой свойством InitialShowDelay. Например, если свойство BetweenShowDelay равно 5000, то у пользователя будет пять секунд на то, чтобы навести указатель мыши на другой элемент управления, у которого имеется всплывающая подсказка. Если пользователь наведет указатель мыши на другой элемент в течение этих пяти секунд, то новая подсказка появится немедленно. Если же пользователь потратит больше пяти секунд, в действие вступит InitialShowDelay. В этом случае вторая подсказка появится после задержки, указанной в свойстве InitialShowDelay.
- ToolTip
Задает содержимое всплывающей подсказки. Задание свойства ToolTipService.ToolTip эквивалентно заданию свойства FrameworkElement.ToolTip элемента
- HasDropShadow
Определяет, будет ли контекстное окно указателя иметь размытую тень, которая "приподнимает" его над находящимся под ним окном
- ShowOnDisabled
Определяет поведение подсказки при отключении базового элемента. Если это свойство имеет значение true, то подсказка будет отображаться для отключенных элементов (т.е. элементов, свойство IsEnabled которых равно false). По умолчанию это свойство равно false, т.е. подсказка отображается только для активных элементов управления
В этом классе определены также два маршрутизируемых события: ToolTipOpening и ToolTipClosing. Реагируя на эти события, можно заполнить окно подсказки актуальным содержимым или переопределить его поведение. Например, если в каждом из этих событий установить флаг handled, подсказки не будут отображаться или скрываться автоматически. Тогда вы сможете выводить и скрывать их вручную с помощью свойства IsOpen.
Не стоит дублировать параметры всплывающих подсказок для нескольких элементов управления. Если вы хотите получить однотипное поведение всплывающих подсказок во всем приложении, используйте стили, чтобы настройки применялись автоматически. К сожалению, значения свойства ToolTipService не наследуются, то есть если задать их на уровне окна или контейнера, они не будут распространяться на вложенные элементы.
Popup
Элемент управления Popup имеет много общего с элементом ToolTip, хотя ни один из них не является наследником другого.
Как и ToolTip, элемент Popup может содержать любой элемент WPF. (Это содержимое хранится в свойстве Popup.Child, а не в свойстве Content, как во всплывающих подсказках.) Как и в элементе ToolTip, содержимое Popup может распространяться за пределы окна. И, наконец, местоположение элемента Popup можно задать с помощью тех же свойств, а показать и скрыть его можно с помощью того же свойства IsOpen.
Но более важны различия между элементами Popup и ToolTip:
Popup не отображается автоматически. Чтобы этот элемент управления отобразился на экране, нужно установить свойство IsOpen.
Свойство Popup.StaysOpen по умолчанию имеет значение true, поэтому элемент управления Popup не исчезнет с экрана до тех пор, пока вы явным образом не присвоите свойству IsOpen значение false. Если присвоить свойству StaysOpen значение false, элемент Popup исчезнет с экрана, как только пользователь щелкнет где-нибудь на экране.
Всплывающее окно, остающееся открытым, может слегка раздражать, т.к. оно ведет себя наподобие отдельного автономного окна. Если сместить указатель мыши, это окно останется в исходной позиции. Такого поведения нет ни у элемента ToolTip, ни у Popup, у которого свойство StaysOpen имеет значение false: как только вы щелкнете кнопкой мыши, чтобы сдвинуть окно, всплывающая подсказка или всплывающее окно исчезнут с экрана.
В классе Popup имеется свойство PopupAnimation, которое позволяет управлять процессом появления окна, когда его свойству IsOpen присваивается значение true. Это свойство может принимать значения None (по умолчанию), Fade (постепенное увеличение непрозрачности), Scroll (непрозрачность плавно распространяется из левого верхнего угла окна) и Slide (окно скользит на свое место). Чтобы активировать любой из этих анимационных эффектов, необходимо, чтобы свойство AllowsTransparency также имело значение true.
Элементы Popup могут принимать фокус. Значит, они могут содержать элементы интерактивной связи с пользователем (например, Button). Эта возможность является одной из ключевых причин использования элемента Popup вместо ToolTip.
Элемент управления Popup определен в пространстве имен System.Windows.Controls.Primitives, так как он чаще всего используется в составе более сложных элементов управления. Элементы Popup не так элегантны, как другие элементы управления. Например, чтобы видеть содержимое, необходимо определить свойство Background, т.к. оно не наследуется от окна. Рамку тоже придется добавлять самостоятельно (для этого очень удобен элемент Border).
Ниже представлен пример использования элемента Popup:
<Grid>
<TextBlock TextWrapping="Wrap" Margin="5" FontSize="14">
Программирование на языке C#, <Run TextDecorations="Underline" Cursor="Hand"
MouseEnter="Run_MouseEnter">платформа WPF</Run>
</TextBlock>
<Popup Name="pLink" StaysOpen="False" Placement="Mouse" MaxWidth="150"
PopupAnimation="Scroll" AllowsTransparency="True">
<Border BorderBrush="LightBlue" BorderThickness="2" Background="White">
<TextBlock Margin="10" TextWrapping="Wrap">
Посмотреть на <Hyperlink NavigateUri="http://professorweb.ru"
Click="Hyperlink_Click">professorweb.ru</Hyperlink>
</TextBlock>
</Border>
</Popup>
</Grid>
private void Run_MouseEnter(object sender, MouseEventArgs e)
{
pLink.IsOpen = true;
}
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
Process.Start(((Hyperlink)sender).NavigateUri.ToString());
}