56

私がやりたいことは、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でそれはできませんか?XAML の学習プロセスでは、「HTML で行う方法を既に知っていることを行うにはどうすればよいか」という小さな問題が非常に多くの時間を費やします。

4

8 に答える 8

172

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

レイアウト動作が異なる2つの別個のクラス階層があることに気付いたら、ハイパーリンクが物事の「テキスト」側にあることは理にかなっています(たとえば、中央にハイパーリンクがある段落を簡単に作成できます。改行を折り返すハイパーリンク)。

しかし、いいえ、始めたばかりのときはそれほど発見できません。

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

<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>
于 2009-08-09T23:06:57.633 に答える
38

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

<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>
于 2009-02-11T12:26:13.907 に答える
33

これを試して:

<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);
}
于 2012-11-26T07:37:47.903 に答える
4

単純なテキスト値以外のものにバインドしている場合は、使用する必要があります。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>
于 2010-08-10T09:56:05.627 に答える
2

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

<HyperlinkButton
    NavigateUri="https://dev.windowsphone.com"
    TargetName="_blank"
    Content="Windows Phone Dev Center" />
于 2012-12-21T01:12:20.553 に答える
1

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

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

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

于 2009-02-10T09:48:07.780 に答える