[〜#〜] wpf [〜#〜]でリンクのようなスタイルのボタンを使用したい。 Microsoftは、Windowsのダイアログボックスでこれを(一見矛盾しているように)行います。
彼らは青いテキストのように見えます。マウスカーソルを置いたときに色と下線を変更します。
うまくいきました。 ( Christian 、 Anderson Imes 、および MichaC に感謝)しかし、ボタンの中にTextBlock
を配置する必要がありました。
ボタン内にTextBlockを必要とせずに機能させるために、スタイルをどのように改善できますか?
<Button Style="{StaticResource HyperlinkLikeButton}">
<TextBlock>Edit</TextBlock>
</Button>
<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>
ハイパーリンク クラス/タグがあることを知っていますか?ハイパーリンクのように見え、ボタンとしても機能します(URIやコマンド、クリックイベントを使用できます)。
編集:
使用例:
<TextBlock>
<Hyperlink Command="{Binding SomeCommand, ElementName=window}" CommandParameter="{Binding}">Link
</Hyperlink>
</TextBlock>
パーティーには少し遅れますが...
最もシンプルでクリーンなアプローチ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>
次のスタイルまたはテンプレートを使用する場合、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>
<Button Style="{StaticResource HyperlinkLikeButton}" Content="Edit" />
または
<Button Style="{StaticResource HyperlinkLikeButton}">
Edit
</Button>
または、テンプレートを直接使用できます
<Button Template="{StaticResource HyperlinkLikeButtonTemplate}" Content="Edit" />
とにかく、グローバルにではなくインラインでスタイルを適用しているのであれば、何か不足しているのでない限り、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
イベントを使用します。
問題は、ボタンがコンテンツコントロールであることですが、リンクスタイルはコンテンツとしてのテキストでのみ機能します。これが、コードがそのように設計されている理由です。コンテンツプレゼンターの代わりにテキストブロックを指定することでコントロールテンプレートで作業できると思いますが、それにバインドするプロパティは何ですか。だから私の提案は:サブクラスボタンであり、文字列型の依存関係プロパティを宣言し、そのプロパティを使用してControlTemplateのテキストをバインドします。