WPFのリンクボタン


90

ButtonをLinkBut​​tonのようにするにはどうすればよいですか。ハイパーリンクを使用したくありません... !!

助言がありますか


1
誰かが気にすると、ここにあるすべての回答の問題は、回答のリンクが実際にはリンクのように動作しないことです。彼らは訪問したURLの履歴を認識せず、色はシステムのURLの色ではありません。ただし、これらの要件がない場合は問題ありません。

正しいWindowsの色を使用する方法を理解しようとしています。stackoverflow.com/questions/5094447
Zack Peterson

回答:


148

通常のボタンスタイルを必要とせず、ハイパーリンクのように見えるものだけが必要な場合は、これで開始できます。

<Button Margin="5" Content="Test" Cursor="Hand">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <TextBlock TextDecorations="Underline">
                <ContentPresenter />
            </TextBlock>
        </ControlTemplate>
    </Button.Template>
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Blue" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="Foreground" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

これはスタイルと同じです:

<Style
    x:Key="LinkButton"
    TargetType="Button">
    <Setter
        Property="Template">
        <Setter.Value>
            <ControlTemplate
                TargetType="Button">
                <TextBlock
                    TextDecorations="Underline">
                <ContentPresenter /></TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter
        Property="Foreground"
        Value="Blue" />
    <Style.Triggers>
        <Trigger
            Property="IsMouseOver"
            Value="true">
            <Setter
                Property="Foreground"
                Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

次のように使用できます:

<Button Style="{StaticResource LinkButton}" Content="Clicky" />

ここにタイプミスがあることに注意してください-LinkBut​​on
GarethD

2
この答えは、下線とテキストの間にスペースがあるボタンを生成します。@Christiansの回答はこれを解決します。
Greg Sansom、

また、ハイパーリンクの上にカーソルを置いたときに「ハンド」ポインタも表示されません。この機能については、コミュニティWikiの回答を使用してください。
AlbatrossCafe

<Trigger Property="IsEnabled" Value="False"><Setter Property="Foreground" Value="Gray" /> </Trigger>IsEnabled状態を処理するために追加することをお勧めします
サイモン

33
<Style x:Key="LinkButton" 
       TargetType="Button"
       BasedOn="{StaticResource ResourceKey={x:Type Button}}"
       >

    <Setter Property="Width" Value="Auto"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <ContentPresenter Content="{TemplateBinding Content}" 
                                  ContentTemplate="{TemplateBinding  ContentTemplate}"
                                  VerticalAlignment="Center"
                                  >
                    <ContentPresenter.Resources>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="TextDecorations" Value="Underline" />
                        </Style>
                    </ContentPresenter.Resources>
                </ContentPresenter>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="Blue" />
    <Setter Property="Cursor" Value="Hand" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

MichaCとAndersonのバージョンは、下線をわずかに間違って配置しましTextBlockContentPresenter。これは、内にあるものに下線を追加するだけの更新バージョンです。


1
クリスチャン:あなたのスタイルを使って下線が見えないのはなぜですか?MichaCは私にとってはうまくいきました。
ニューマン'18年

これも私にはうまくいきません。ContentPresenter.Resources内のスタイルがボタン内のどのTextBlockにも適用されない
Clyde

OK、問題は、スタイルが暗黙的に生成されたTextBlockにのみ適用されるようです
Clyde

<Button Style = "{StaticResource LinkBut​​ton}"> Text </ Button>が機能します
Clyde

<Button Style = "{StaticResource LinkBut​​ton}"> <TextBlock Text = "test" /> </ Button>が機能しない
Clyde

30

以下はStyle、任意のボタンで再利用できるとして実装されたMichaCの提案です。

<Style x:Key="LinkButton" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <TextBlock TextDecorations="Underline">
                    <ContentPresenter />
                </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Foreground" Value="Blue" />
    <Setter Property="Cursor" Value="Hand" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

8
この回答の99%がMichaCから盗まれたことを考慮して、これをコミュニティWikiにしました:)
Anderson Imes

11

最も簡単な方法(アプリケーションでこれを行います):

<TextBlock Name="..."
   Text="..."
   Cursor="Hand"
   Foreground="Blue"
   TextDecorations="Underline"
   MouseLeftButtonUp=..."
/>

ペンのスタイルやオフセットの変更など、TextDecorationを完全に制御できます。詳細については、このリンクを参照してくださいhttp : //msdn.microsoft.com/en-us/library/system.windows.textdecorations.underline.aspx


4
悪い習慣、推奨されるリンクボタンのスタイル設定ははるかに優れています...そのような50個のリンクボタンがある場合はどうでしょうか。さらに、ホバーアクションまたは別の装飾を追加する必要がある場合はどうでしょうか。
Tomer W

3
私はトメールに同意しません。「悪い習慣」は、この単純なアプローチが必要になることは決してないことを意味します。今のところ、これが完璧な解決策であるケースがあります(つまり、コードビハインドでボタンを作成することでした)。Siavashに感謝します。
Gabe Halsmer、2014年

ええ、これは悪い習慣ではありません。いくつかのシナリオに最適です。
Richard Moore

8

使用する別の解決策Hyperlinkは、中に入れることTextBlockです。

<TextBlock>
    <Hyperlink Click="...">
        <TextBlock Text="Link text" />
    </Hyperlink>
</TextBlock>

2

なぜハイパーリンクを使いたくないのですか?

<Button>
    <Hyperlink>
</Button>

Coz、ビジュアルツリーで親を取得しようとすると、ハイパーリンクがビジュアルでもVisual3dでもないという例外がスローされます
Prashant Cholachagudda 2009

これを使いたいです。機能しましたが、ボタンの端にある影を取り除くことができません。どうやってやるの?
Donny V.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.