web-dev-qa-db-ja.com

WPFボタンをリンクのようにするにはどうすればよいですか?

[〜#〜] wpf [〜#〜]でリンクのようなスタイルのボタンを使用したい。 Microsoftは、Windowsのダイアログボックスでこれを(一見矛盾しているように)行います。

彼らは青いテキストのように見えます。マウスカーソルを置いたときに色と下線を変更します。

例:

LinkButton in Windows 7

うまくいきました。 ( ChristianAnderson Imes 、および MichaC に感謝)しかし、ボタンの中にTextBlockを配置する必要がありました。

ボタン内にTextBlockを必要とせずに機能させるために、スタイルをどのように改善できますか?

使用XAML

<Button Style="{StaticResource HyperlinkLikeButton}">
    <TextBlock>Edit</TextBlock>
</Button>

スタイルXAML

<Style x:Key="HyperlinkLikeButton" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" />
    <Setter Property="Cursor" Value="Hand" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <ControlTemplate.Resources>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="TextDecorations" Value="Underline" />
                            </Style>
                        </ControlTemplate.Resources>
                        <ContentPresenter />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>
36
Zack Peterson

ハイパーリンク クラス/タグがあることを知っていますか?ハイパーリンクのように見え、ボタンとしても機能します(URIやコマンド、クリックイベントを使用できます)。

編集:

使用例:

<TextBlock>                                
    <Hyperlink Command="{Binding SomeCommand, ElementName=window}" CommandParameter="{Binding}">Link
    </Hyperlink>
</TextBlock>
36
Matěj Zábský

パーティーには少し遅れますが...

最もシンプルでクリーンなアプローチIMO:

<Style x:Key="HyperLinkButtonStyle" TargetType="Button">
    <Setter Property="Focusable" Value="False" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <TextBlock>
                    <Hyperlink>
                        <Run Text="{TemplateBinding Content}" />
                    </Hyperlink>
                </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  • 忠実、エミュレーションなしHyperlink 自体を使用します
  • 敬意:重要な側面であるフォーカスが保持されます
15
Aybe

次のスタイルまたはテンプレートを使用する場合、TextBlock要素を使用する必要はありません。

  <ControlTemplate x:Key="HyperlinkLikeButtonTemplate" TargetType="{x:Type Button}">
      <TextBlock x:Name="innerText" Foreground="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" Cursor="Hand" >
        <ContentPresenter />
      </TextBlock>
    <ControlTemplate.Triggers>
      <Trigger Property="Button.IsMouseOver" Value="true">
        <Setter TargetName="innerText" Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
        <Setter TargetName="innerText" Property="TextDecorations" Value="Underline" />
      </Trigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>

  <Style x:Key="HyperlinkLikeButton" TargetType="{x:Type Button}">
    <Setter Property="Template" Value="{StaticResource HyperlinkLikeButtonTemplate}" />
  </Style> 

使用XAML

<Button Style="{StaticResource HyperlinkLikeButton}" Content="Edit" />

または

<Button Style="{StaticResource HyperlinkLikeButton}">
    Edit
</Button>

または、テンプレートを直接使用できます

<Button Template="{StaticResource HyperlinkLikeButtonTemplate}" Content="Edit" />
9
Yves Tkaczyk

とにかく、グローバルにではなくインラインでスタイルを適用しているのであれば、何か不足しているのでない限り、TextBlockのスタイリングを回避できませんか?例えば:

<Style x:Key="LinkButton" TargetType="TextBlock">            
    <Setter Property="Cursor" Value="Hand" />
    <Setter Property="Margin" Value="0,0,10,0" />
    <Setter Property="TextDecorations" Value="Underline" />
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />                 
        </Trigger>
    </Style.Triggers>
</Style>

など:

<TextBlock Style="{StaticResource LinkButton}">Edit</TextBlock>

クリックを有効にするには、MouseUpイベントを使用します。

1
Grant Thomas

問題は、ボタンがコンテンツコントロールであることですが、リンクスタイルはコンテンツとしてのテキストでのみ機能します。これが、コードがそのように設計されている理由です。コンテンツプレゼンターの代わりにテキストブロックを指定することでコントロールテンプレートで作業できると思いますが、それにバインドするプロパティは何ですか。だから私の提案は:サブクラスボタンであり、文字列型の依存関係プロパティを宣言し、そのプロパティを使用してControlTemplateのテキストをバインドします。

1
Felice Pollano