Гиперссылки

34

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

Например, ниже показано объединение текста и ссылок в элементе TextBlock, который является самым практичным контейнером для гиперссылок:

<TextBlock Margin="5">
      Это обычная страница. А это <Hyperlink NavigateUri="page2.xaml">ссылка на другую страницу!</Hyperlink>
</TextBlock>

При визуализации гиперссылки отображаются как хорошо знакомый подчеркнутый текст синего цвета:

Ссылка на другую страницу

Щелчки на ссылке можно обрабатывать двумя способами: реагировать на событие Click и использовать код для выполнения какой-то задачи либо просто направлять пользователя на другую страницу. Однако существует и более простой подход. Класс Hyperlink также включает свойство NavigateUri, которое можно устанавливать так, чтобы оно указывало на любую другую страницу в приложении. В таком случае при щелчке на гиперссылке пользователи будут попадать на целевую страницу автоматически.

Свойство NavigateUri работает только в том случае, если гиперссылка размещается на странице. При желании использовать гиперссылку в оконном приложении, чтобы позволить пользователям выполнять какую-то задачу, переходить на веб-страницу или открывать новое окно, придется обрабатывать событие RequestNavigate и писать код самостоятельно.

Гиперссылки не являются единственным способом для перехода с одной страницы на другую. NavigationWindow включает две заметные кнопки: "назад" и "вперед" (если только они не скрыты установкой свойства Page.ShowsNavigationUI в false). Щелкая на этих кнопках, пользователи могут перемещаться по навигационной последовательности на одну страницу назад или вперед. Как и в окне браузера, пользователи также могут щелкать на стрелке раскрывающегося списка, отображаемой по краям этих кнопок, и просматривать всю последовательность, а также "перепрыгивать" сразу на несколько страниц назад или вперед:

Хронология посещенных страниц

В случае перехода на новую страницу, у которой свойство WindowTitle не установлено, окно сохраняет тот же заголовок, который был на предыдущей странице. Если свойство WindowTitle не устанавливается ни на одной странице, заголовок окна остается пустым.

Навигация по веб-сайтам

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

<TextBlock Margin="5">
            Это обычная страница. А это 
            <Hyperlink NavigateUri="http://professorweb.ru">ссылка на наш сайт</Hyperlink>
        </TextBlock></pre>

Однако при использовании такого приема обязательно должен быть присоединен обработчик к событию Application.DispatcherUnhandledException или Application.NavigationFailed. Попытка посещения веб-сайта может оказаться неудачной, если компьютер не подключен к сети, сайт не доступен или веб-содержимое отсутствует. В таком случае сеть возвращает ошибку вроде "404: File Not Found" (404: файл не найден), которая воплощается в исключение WebException. Для аккуратной обработки этого исключения и предотвращения неожиданного завершения работы приложения оно должно быть нейтрализовано с помощью следующего обработчика:

private void Application_NavigationFailed(object sender, 
       System.Windows.Navigation.NavigationFailedEventArgs e)
{
   if (e.Exception is System.Net.WebException)
   {
         MessageBox.Show("Сайт "+e.Uri.ToString() + " не доступен :(");
         // Нейтрализовать ошибку, чтобы приложение продолжило свою работу
         e.Handled = true;
   }
}

NavigationFailed — это всего лишь одно из нескольких навигационных событий, которые определены в классе Application.

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

В случае отображения страниц с внешних веб-сайтов нельзя делать много вещей. Например, нельзя запретить пользователю переходить на какие-то конкретные страницы или сайты. Также нельзя и взаимодействовать с веб-страницей с помощью объектной модели документов HTML DOM (Document Object Model — объектная модель документа). Это означает, что сканировать страницу для поиска ссылок или изменять ее динамически тоже нельзя. Выполнение всех этих задач становится возможным только в случае использования элемента управления WebBrowser.

Последним приемом, который можно использовать с гиперссылкой, является навигация по фрагментам. Добавив знак # в конце NavigateUri, а за ним — имя элемента, можно сразу же переходить к конкретному элементу управления на странице. Однако такой прием работает, только если целевая страница является прокручиваемой (а таковой она является тогда, когда использует элемент управления ScrollViewer или обслуживается в веб-браузере).

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