Всплывающие подсказки

54

WPF предлагает гибкую модель для всплывающих подсказок (tooltip — желтые окошки, которые появляются при наведении указателя мыши на какой-то объект). Поскольку в WPF всплывающие подсказки относятся к элементам управления содержимым, в них можно поместить практически что угодно. Можно также настроить различные временные параметры, чтобы задать время, после которого подсказка появляется и исчезает.

Самый простой способ вывода всплывающих подсказок — отнюдь не непосредственное использование класса ToolTip. Вместо этого достаточно просто определить свойство ToolTip нужного элемента. Свойство ToolTip определено в классе FramworkElement, поэтому оно доступно для любого элемента, которое может разместиться в окне WPF. Например, вот кнопка с простой всплывающей подсказкой:

<Button ToolTip="Подсказка!">I have a tooltip</Button>

Если навести на нее курсор, то в знакомом желтом окошке появится текст: "Подсказка!".

Если нужно не такое простое содержимое всплывающей подсказки (например, комбинация вложенных элементов), придется выделить свойство ToolTip в отдельный элемент. Ниже показан пример, в котором для кнопки задается свойство ToolTip с помощью более сложного вложенного содержимого:

<Button Content="OK">
            <Button.ToolTip>
                <ToolTip Background="#90004455">
                    <StackPanel>
                    <TextBlock Margin="3" Foreground="White">Всем привет, я подсказка!</TextBlock>
                    <Image Source="grimace.png" Width="50" Margin="3"></Image>
                    <TextBlock Margin="3">Это кнопка</TextBlock>
                </StackPanel>
              </ToolTip>
            </Button.ToolTip>
        </Button>
Всплывающая подсказка (ToolTip)

При наложении нескольких всплывающих подсказок приоритет имеет наиболее специальная из них. Например, если в предыдущем примере добавить всплывающую подсказку к контейнеру StackPanel, то именно она появится при наведении курсора на пустое место панели или элемента управления, у которого нет собственной всплывающей подсказки.

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

Настройка параметров всплывающей подсказки

В предыдущем примере было показано, как можно настроить содержимое всплывающей подсказки. А если нужно сконфигурировать ее другие параметры? На этот случай есть два варианта. Первый — явное определение объекта ToolTip. Это позволяет непосредственно задать разнообразные свойства ToolTip.

ToolTip является элементом управления содержимым, поэтому для него можно настроить стандартные свойства, такие как Background (чтобы сменить желтый фоновый цвет), Padding и Font. Можно также изменить свойства, определенные в классе ToolTip (они перечислены ниже). Большинство этих свойств предназначено для размещения подсказки точно в нужном месте.

HasDropShadow

Определяет, имеет ли окно подсказки размытую темную тень, которая "приподнимает" его над находящимся под ним окном

Placement

Определяет позицию подсказки с помощью одного из значений из перечисления PlacementMode. Значением по умолчанию является Mouse, которое означает, что верхний левый угол подсказки будет располагаться относительно текущей позиции указателя мыши. (Действительное положение подсказки может быть смещено от начальной точки с помощью свойств HorizontalOffset и VerticalOffset.)

Кроме того, местоположение подсказки можно задавать, указав абсолютные координаты на экране или координаты относительно некоторого элемента, который задается свойством PlacementTarget

HorizontalOffset, VerticalOffset

Позволяют точно позиционировать окно подсказки. Допустимы как положительные, так и отрицательные значения

PlacementTarget

Позволяет позиционировать окно подсказки относительно другого элемента. Чтобы использовать это свойство, свойство Placement должно иметь одно из следующих значений: Left, Right, Тор или Bottom. (Это одна из границ элемента, по которой будет выравниваться подсказка.)

PlacementRectangle

Задает смещение окна подсказки. Работает почти так же, как и свойства HorizontalOffset и VerticalOffset. Это свойство не сработает, если свойство Placement имеет значение Mouse

CustomPopupPlacementCallback

Позволяет динамически позиционировать окно подсказки с помощью кода. Если свойство Placement имеет значение Custom, то это свойство определяет метод, вызываемый объектом ToolTip для получения местоположения подсказки. Метод обратного вызова получает три аргумента: popupSize (размер ToolTip), targetSize (размер PlacementTarget, если он используется) и offset (точка, которая создается на основе свойств HorizontalOffset и VerticalOffset). Этот метод возвращает объект CustomPopupPlacement, который сообщает WPF, где поместить окно подсказки

StaysOpen

Не имеет никакого практического эффекта. Это свойство предназначено для создания всплывающего окна подсказки, которое остается открытым до тех пор, пока пользователь не щелкнет еще где-нибудь. Однако его перекрывает свойство ToolTipService.ShowDuration StaysOpen. Поэтому всплывающие подсказки всегда исчезают по истечении заданного промежутка времени (обычно примерно 5 секунд) или при сдвиге указателя мыши. Если вы хотите создать окно в виде всплывающей подсказки, которое будет оставаться открытым неопределенно долго, то проще всего использовать элемент Popup

IsEnabled, IsOpen

Позволяют управлять поведением подсказки с помощью кода. Свойство IsEnabled позволяет временно отключить всплывающую подсказку, a IsOpen — программно отображать и скрывать подсказку (или просто проверять, открыто ли ее окно)

В большинстве случаев вполне достаточно использовать стандартное размещение окна подсказки — в текущей позиции указателя мыши. Но разнообразные свойства ToolTip предлагают множество других вариантов размещения. Вот некоторые стратегии позиционирования подсказки:

Привязка к текущей позиции указателя мыши

Это стандартный способ, когда свойству Placement присваивается значение Mouse. Левый верхний угол окна подсказки размещается в левом верхнему углу невидимого "прямоугольника" вокруг курсора.

Привязка к позиции элемента под указателем мыши

Свойству Placement присваивается значение Left, Right, Top, Bottom или Center — т.е. указывается край элемента, который нужно использовать для привязки. Левый верхний угол контекстного окна указателя будет выровнен по этому краю.

Приемка к позиции другого элемента (или окна)

Свойство Placement задается точно так же, как при выравнивании подсказки по текущему элементу (используются значения Left, Right, Тор или Center). Затем с помощью свойства PlacementTarget указывается базовый элемент. Не забывайте указать нужный элемент с помощью синтаксиса {Binding ElementName=Имя}.

Определение смещения

Используется одна из вышеперечисленных стратегий, а также определяются свойства HorizontalOffset и VerticalOffset, чтобы получить небольшой сдвиг.

Использование абсолютных координат

Свойству Placement присваивается значение Absolute, а свойства HorizontalOffset и VerticalOffset (или PlacementRectangle) задают расстояние от окна подсказки до левого верхнего угла окна.

Расчет во время выполнения

Свойству Placement присваивается значение Custom. С помощью свойства CustomPopupPlacementCallback указывается созданный вами метод.

Пройди тесты
Лучший чат для C# программистов