Подтвердить что ты не робот

Как сделать простую гиперссылку в 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: в Visual Studio 2010 я хочу, чтобы Clippy всплыл и сказал: "Кажется, вы пытаетесь сделать гиперссылку" и расскажите мне, как это сделать. Разве вы не можете сделать это с помощью MEF? Это было бы ретро круто, и эти маленькие "как я делаю то, что я уже знаю, как делать в HTML", проблемы выжигают так много времени в процессе обучения с помощью XAML.

4b9b3361

Ответ 1

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

<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>

Ответ 2

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

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

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

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

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

Ответ 3

Попробуйте следующее:

<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");
}

Ответ 4

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

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

Пример, где я "m привязка к 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>

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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