programing

WPF 버튼을 링크처럼 보이게 하려면 어떻게 해야 하나요?

sourcejob 2023. 4. 14. 21:38
반응형

WPF 버튼을 링크처럼 보이게 하려면 어떻게 해야 하나요?

WPF에서 링크와 같은 스타일의 버튼을 사용하고 싶습니다.Microsoft 는, 이것을 Windows 의 다이얼로그 박스에서(일관성이 없는 것처럼 보입니다) 실시합니다.

파란색 글씨처럼 보여요.마우스 커서가 위로 이동하면 색상과 밑줄을 바꿉니다.

예:

Windows 7의 Link Button

내가 해냈다.(크리스찬, 앤더슨 아이즈, 마이클 덕분에) 하지만, 저는 이 노래를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>

하이퍼링크 클래스/태그가 있는 것을 알고 있습니까?하이퍼링크처럼 보여 버튼으로도 사용할 수 있습니다(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> 

사용방법 XAML

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

또는

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

또는 템플릿을 직접 사용할 수 있습니다.

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

버튼은 콘텐츠 컨트롤이지만 링크 스타일은 텍스트만 콘텐츠로 동작하는 것이 문제인 것 같습니다.이것이 당신이 가지고 있는 코드가 그렇게 설계된 이유입니다.콘텐트 프레젠터 대신 텍스트 블록을 지정함으로써 컨트롤 템플릿에서 작업할 수 있다고 생각합니다만, 거기에 바인드 되는 속성은 무엇입니까?그래서 제안하고 싶은 것은 버튼을 서브클래스로 하여 type string의 의존 속성을 선언하고 그 속성을 사용하여 ControlTemplate의 텍스트를 바인드하는 것입니다.

내가 놓친 게 아니라면, 그냥 스타일링 좀 해주시면 안 될까요?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이벤트입니다.

언급URL : https://stackoverflow.com/questions/5122334/how-do-i-make-a-wpf-button-look-like-a-link

반응형