web-dev-qa-db-ja.com

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での学習プロセス中に非常に多くの時間を費やします。

51
Edward Tanguay

Buttonをカスタムコントロールテンプレートで使用できます。以下のコードは制限されたハイパーリンクスタイルのボタンです(たとえば、テキストハイパーリンクのみをサポートします)が、正しい方向を示すことができます。

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

StackPanelにハイパーリンクを追加することはできません。実行時エラーが発生します。 (実際、コンパイル時のエラーではないことに驚いています。)これは、ハイパーリンクが<Button><StackPanel>などのWPFの「コントロール」側に存在しないためです。画面の長方形のチャンクに出力し、UIElementから派生します。代わりに、<Bold>および<Run>および<Paragraph>およびその他の一般的にテキスト形式のもので、行と段落でワードラップおよびフローされ、TextElementから派生するものの「テキスト」側に存在します。 。

レイアウトの動作が異なる2つの別個のクラス階層があることに気づいたら、ハイパーリンクが物の「テキスト」側にあることは理にかなっています(例えば、中央にハイパーリンクのある段落、さらにはそのために改行を囲むハイパーリンク)。

しかし、いいえ、あなたが始めているとき、それはそれほど発見可能ではありません。

2つの世界を混在させ、ハイパーリンクをコントロールとして使用するには、TextBlockに入れるだけです。 TextBlockは、テキストのようなものを含む(つまり、ハイパーリンクを含むことができる)コントロールのようなものです(つまり、StackPanelに入れることができます)。

<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>
168
Joe White

これを試して:

<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(e.Uri.AbsoluteUri);
}
24
<TextBlock>
  <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate">
   <TextBlock Text="{Binding YourText}" />
  </Hyperlink>
</TextBlock>

これは、ネストされたテキストブロック内のバインドされたテキストをリンクします。私はまだより良い方法を見つけていません。可能な場合は最初のテキストブロックが存在しないようにします。これはDataTemplatesでも機能します。

5
VampireMonkey

単純なテキスト値以外にバインドする場合はContentPresenterを使用する必要があり、そうでない場合は何も表示されないことがあります。XMLデータソースにバインドしている場合はこれが当てはまる場合があります。

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>
4
Brett Ryan

HyperlinkBut​​ton を使用するだけです。クリックすると、URLがWebブラウザーに表示されます。

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

通常、ハイパーリンクの意味は、ユーザーを別のページに送信したり、一般的に別のリソースに話したりするためのアンカーを与えることです。そのため、このように実装され、次のようにそのリソースの場所を指定する必要があります:

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

ただし、HyperLinkとして使用され、クリックイベントをサポートするカスタムTextBlockで このブログ を見つけました。

1
Stefano Driussi

私はこれを使用していますmvvmcrossとUWPで

  <HyperlinkButton Content="{Binding TextSource, ConverterParameter=MyUrl, Converter={StaticResource Language},
           FallbackValue=_MyUrl}" NavigateUri="http://www.google.com" />
0
El0din