source

XAML에서 간단한 하이퍼링크를 만드는 방법

nicesource 2023. 4. 19. 23:14
반응형

XAML에서 간단한 하이퍼링크를 만드는 방법

제가 원하는 건 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로 하면 안 돼요?복고풍으로 하면 좋을 것 같습니다.또, 「HTML로 이미 알고 있는 것을 어떻게 할 것인가」라고 하는 사소한 문제도, XAML에 의한 학습 프로세스중에 많은 시간을 소비합니다.

StackPanel에 하이퍼링크를 추가할 수 없습니다.실제로 컴파일 시 오류가 아닌 것에 놀랐습니다.이는 하이퍼링크가 WPF의 "제어" 쪽에 존재하지 않기 때문입니다.<Button>그리고.<StackPanel>직사각형의 화면 덩어리에 배치되어 있는 다른 것들로부터 내려오는 것.UIElement대신, 사물의 "텍스트" 쪽에 살고 있습니다.<Bold>그리고.<Run>그리고.<Paragraph>그리고 단어에 따라 행과 단락을 따라 흘러내리는 다른 일반적으로 텍스처한 것TextElement.

레이아웃 동작이 다른 두 개의 클래스 계층이 있다는 것을 알게 되면 하이퍼링크는 사물의 "텍스트" 쪽에 있습니다(예를 들어, 하이퍼링크가 중간에 있는 단락을 쉽게 만들 수 있고, 하이퍼링크가 줄 바꿈에 걸쳐 줄바꿈할 수도 있습니다).

하지만 처음 시작할 때는 그렇게 쉽게 발견할 수 없어요.

두 세계를 혼합하여 하이퍼링크를 컨트롤로 사용하려면 텍스트 블록에 하이퍼링크를 넣기만 하면 됩니다.TextBlock은 텍스트와 유사한 것(하이퍼링크를 포함할 수 있음)을 포함하는 제어 가능한 것(StackPanel에 넣을 수 있음)입니다.

<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>

사용자 정의 컨트롤 템플릿과 함께 단추를 사용할 수 있습니다. 아래 코드는 제한된 하이퍼링크 스타일 버튼(예: 텍스트 하이퍼링크만 지원)이지만 올바른 방향으로 안내할 수 있습니다.

<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>

이것을 시험해 보세요.

<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);
}
<TextBlock>
  <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate">
   <TextBlock Text="{Binding YourText}" />
  </Hyperlink>
</TextBlock>

이렇게 하면 중첩된 텍스트 블록에 바인딩된 텍스트가 모두 링크됩니다. 더 나은 방법을 찾지 못했습니다. 가능하면 첫 번째 텍스트 블록이 없는 것이 좋습니다.이것은 DataTemplates에도 유효합니다.

단순한 텍스트 값 이외의 다른 값에 바인딩할 경우 다음을 사용해야 할 수 있습니다.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>

Hyperlink Button을 사용하면 됩니다.클릭하면 웹 브라우저에 URL이 표시됩니다.

<HyperlinkButton
    NavigateUri="https://dev.windowsphone.com"
    TargetName="_blank"
    Content="Windows Phone Dev Center" />

일반적으로 하이퍼링크의 의미는 사용자를 다른 페이지로 보내거나 일반적으로 다른 리소스로 말할 수 있도록 앵커를 지정하는 것입니다. 따라서 하이퍼링크는 다음과 같이 구현되고 해당 리소스의 위치를 지정해야 합니다.

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

단, 이 블로그 투고는 HyperLink로 사용되며 클릭 이벤트를 지원하는 커스텀 TextBlock을 포함하고 있습니다.

mvvmcross를 사용하는 UWP에서는 이것을 사용하고 있습니다.

  <HyperlinkButton Content="{Binding TextSource, ConverterParameter=MyUrl, Converter={StaticResource Language},
           FallbackValue=_MyUrl}" NavigateUri="http://www.google.com" />

언급URL : https://stackoverflow.com/questions/531621/how-to-make-a-simple-hyperlink-in-xaml

반응형