2009-02-10 5 views
45

Все, что я хочу сделать, это сделать небольшую гиперссылку в XAML. Я все пробовал. Я сдаюсь.Как сделать простую гиперссылку в XAML?

Что такое синтаксис для этого?

<StackPanel Width="70" HorizontalAlignment="Center"> 

    <Hyperlink Click="buttonClose_Click" Cursor="Hand" 
     Foreground="#555" Width="31" Margin="0 0 0 15" 
     HorizontalAlignment="Right">Close</Hyperlink> 

    <Button Width="60" Margin="0 0 0 3">Test 1</Button> 
    <Button Width="60" Margin="0 0 0 3">Test 2</Button> 
    <Button Width="60" Margin="0 0 0 3">Test 3</Button> 
    <Button Width="60" Margin="0 0 0 3">Test 4</Button> 
</StackPanel> 

Visual Studio Team: В Visual Studio 2010 я хочу Clippy всплывал и сказать: «Кажется, что вы пытаетесь сделать гиперссылку» и скажите мне, как это сделать. Разве вы не можете сделать это с помощью MEF? Это было бы ретро круто, и эти маленькие «как я делаю то, что я уже знаю, как делать в HTML», проблемы вызывают так много времени в процессе обучения с помощью XAML.

+5

+1 - «как я делаю то, что я уже знаю, как это сделать в HTML» вопросы сжечь так много времени в процессе обучения с XAML. «-Вы не ошибаетесь. –

+2

С уважением, ставить Клиппи в VS - это действительно плохая идея! Можете ли вы представить, что раздражающий скрепка поднимает то, что вы программируете, и делаете неверные предложения? Я думаю, вы могли бы избежать этих проблем изучая WPF перед тем, как прыгать. – MikeKulls

+1

Так что с вами, во время написания XAML я постоянно плачу «если только это был css ...». – nocarrier

ответ

35

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

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<Page.Resources> 
<Style x:Key="Link" TargetType="Button"> 
    <Setter Property="VerticalAlignment" Value="Center"/> 
    <Setter Property="HorizontalAlignment" Value="Center"/> 
    <Setter Property="Cursor" Value="Hand"/> 
    <Setter Property="Foreground" Value="Blue"/> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <TextBlock TextDecorations="Underline" 
        Text="{TemplateBinding Content}" 
        Background="{TemplateBinding Background}"/> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter Property="Foreground" Value="Red"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
</Page.Resources> 
<Button Content="Click Me!" Style="{StaticResource Link}"/> 
</Page> 
1

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

<HyperLink NavigateUri="http://www.site.com"> 
    Web Site 
</HyperLink> 

Однако, я нашел this blog пост с настраиваемым TextBlock, который используется в качестве HyperLink и поддерживает события нажатия.

+1

Это должна быть гиперссылка, а не HyperLink. – dmo

+0

Это не обязательно. e RequestNavigate событие из гиперссылки. – MikeKulls

162

Вы не можете добавить гиперссылку на StackPanel - вы получите ошибку времени выполнения. (На самом деле, я удивлен, что это не ошибка времени компиляции.) Это потому, что Hyperlink не живет на стороне «управления» WPF с <Button> и <StackPanel> и другими вещами, которые выложены на прямоугольных фрагментах экрана и спускаются от UIElement. Вместо этого он живет в «текстовой» стороне вещей, с <Bold> и <Run> и <Paragraph> и другими обычно текси-вещами, которые переносятся словами и текут в строках и абзацах и опускаются от TextElement.

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

Но нет, это не так легко обнаружить, когда вы начинаете.

Чтобы смешивать два мира и использовать гиперссылку в качестве элемента управления, все, что вам нужно сделать, это поместить его в TextBlock. TextBlock является контрольно-иш вещь (то есть, может пойти в StackPanel), который содержит текст иш вещи (т.е. может содержать гиперссылки):

<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock> 
4

Вы можете обнаружить, что если вы связываете к чему-либо чем простые текстовые значения, вам нужно будет использовать ContentPresenter, иначе ничего не появится, это может быть правдой, если вы привязываетесь к источнику данных XML.

Свойство Trigger для IsMouseOver дает текст подчеркивания.

Пример, где я привязываюсь к XML, представлен ниже.

<Style x:Key="JobNumberStyleButton" TargetType="{x:Type Button}"> 
    <Setter Property="VerticalAlignment" Value="Top"/> 
    <Setter Property="HorizontalAlignment" Value="Left"/> 
    <Setter Property="Cursor" Value="Hand"/> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
     <TextBlock> 
      <ContentPresenter 
      Margin="0,0,0,0" 
      ContentTemplate="{TemplateBinding ContentTemplate}" 
      Content="{TemplateBinding Content}" 
      ContentStringFormat="{TemplateBinding ContentStringFormat}" 
      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
      VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
      RecognizesAccessKey="False" 
      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
     </TextBlock> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
      <TextBlock Padding="0,0,0,0" Margin="0,0,0,0"> 
       <Underline> 
       <ContentPresenter 
        Margin="0,0,0,0" 
        ContentTemplate="{TemplateBinding ContentTemplate}" 
        Content="{TemplateBinding Content}" 
        ContentStringFormat="{TemplateBinding ContentStringFormat}" 
        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
        RecognizesAccessKey="False" 
        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </Underline> 
      </TextBlock> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Trigger> 
    </Style.Triggers> 
</Style> 
19

Попробуйте это:

<TextBlock> 
    <Hyperlink RequestNavigate="Hyperlink_RequestNavigate" 
       NavigateUri="http://www.msn.com">MSN</Hyperlink> 
</TextBlock> 

private void Hyperlink_RequestNavigate(object sender, 
             System.Windows.Navigation.RequestNavigateEventArgs e) 
{ 
    System.Diagnostics.Process.Start("http://www.msn.com"); 
} 
+1

Работайте отлично, одно предложение, если гиперссылка называется btnHyperlink, тогда вы можете изменить обработчик события: private void Hyperlink_RequestNavigate (отправитель объекта, System.Windows.Navigation.RequestNavigateEventArgs e) { System.Diagnostics.Process.Start (btnHyperlink .NavigateUri.AbsoluteUri); } – dotnetguy

+2

Что касается System.Diagnostics.Process.Start (e.Uri.AbsoluteUri) – Ahmad

2

Вы можете просто использовать HyperlinkButton. При щелчке на, то URL будет отображаться в вашем веб-браузере:

<HyperlinkButton 
    NavigateUri="https://dev.windowsphone.com" 
    TargetName="_blank" 
    Content="Windows Phone Dev Center" /> 
+1

Это работает только с Silverlight –

+0

В XAML для универсального приложения TargetName приложения Windows недопустимо. Используйте только NavigateUri и Content. – yehanny

4
<TextBlock> 
    <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate"> 
    <TextBlock Text="{Binding YourText}" /> 
    </Hyperlink> 
</TextBlock> 

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

0

в UWP с mvvmcross я использую этот

<HyperlinkButton Content="{Binding TextSource, ConverterParameter=MyUrl, Converter={StaticResource Language}, 
      FallbackValue=_MyUrl}" NavigateUri="http://www.google.com" /> 
Смежные вопросы