WPF에서 하이퍼 링크를 사용하는 예
Hyperlink
제어를 통해 WPF 응용 프로그램에 하이퍼 링크를 추가 할 수 있다는 몇 가지 제안을 보았습니다 .
내 코드에서 사용하려고하는 방법은 다음과 같습니다.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="BookmarkWizV2.InfoPanels.Windows.UrlProperties"
Title="UrlProperties" Height="754" Width="576">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Grid>
<ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" Grid.RowSpan="2">
<StackPanel >
<DockPanel LastChildFill="True" Margin="0,5">
<TextBlock Text="Url:" Margin="5"
DockPanel.Dock="Left" VerticalAlignment="Center"/>
<TextBox Width="Auto">
<Hyperlink NavigateUri="http://www.google.co.in">
Click here
</Hyperlink>
</TextBox>
</DockPanel >
</StackPanel>
</ScrollViewer>
</Grid>
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Margin="0,7,2,7" Grid.Row="1" >
<Button Margin="0,0,10,0">
<TextBlock Text="Accept" Margin="15,3" />
</Button>
<Button Margin="0,0,10,0">
<TextBlock Text="Cancel" Margin="15,3" />
</Button>
</StackPanel>
</Grid>
</Window>
다음과 같은 오류가 발생합니다.
'Text'속성은 'Hyperlink'유형의 값을 지원하지 않습니다.
내가 무엇을 잘못하고 있지?
당신이의 링크를 열려면 응용 프로그램하려면 웹 브라우저를 당신은 추가 할 필요가 하이퍼 링크를 와 RequestNavigate의 프로그램 매개 변수로 주소를 웹 브라우저를 열고 함수에 이벤트 세트.
<TextBlock>
<Hyperlink NavigateUri="http://www.google.com" RequestNavigate="Hyperlink_RequestNavigate">
Click here
</Hyperlink>
</TextBlock>
코드 숨김에서 RequestNavigate 이벤트를 처리하려면 이와 비슷한 것을 추가해야합니다.
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;
}
또한 다음과 같은 수입품이 필요합니다.
using System.Diagnostics;
using System.Windows.Navigation;
응용 프로그램에서 이와 같이 보입니다.
Fuji의 응답 외에도 처리기를 재사용 가능하게하여 첨부 된 속성으로 바꿀 수 있습니다.
public static class HyperlinkExtensions
{
public static bool GetIsExternal(DependencyObject obj)
{
return (bool)obj.GetValue(IsExternalProperty);
}
public static void SetIsExternal(DependencyObject obj, bool value)
{
obj.SetValue(IsExternalProperty, value);
}
public static readonly DependencyProperty IsExternalProperty =
DependencyProperty.RegisterAttached("IsExternal", typeof(bool), typeof(HyperlinkExtensions), new UIPropertyMetadata(false, OnIsExternalChanged));
private static void OnIsExternalChanged(object sender, DependencyPropertyChangedEventArgs args)
{
var hyperlink = sender as Hyperlink;
if ((bool)args.NewValue)
hyperlink.RequestNavigate += Hyperlink_RequestNavigate;
else
hyperlink.RequestNavigate -= Hyperlink_RequestNavigate;
}
private static void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
{
Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;
}
}
그리고 이것을 다음과 같이 사용하십시오 :
<TextBlock>
<Hyperlink NavigateUri="http://stackoverflow.com" custom::HyperlinkExtensions.IsExternal="true">
Click here
</Hyperlink>
</TextBlock>
Hyperlink
컨트롤 이 아닌 흐름 콘텐츠 요소이므로 흐름 콘텐츠를 지원하는 컨트롤 (예 :) 만 사용할 수 있습니다 TextBlock
. TextBoxes
일반 텍스트 만 있습니다.
나중에 문자열을 지역화하려면 해당 답변으로는 충분하지 않습니다.
<TextBlock>
<Hyperlink NavigateUri="http://labsii.com/">
<Hyperlink.Inlines>
<Run Text="Click here"/>
</Hyperlink.Inlines>
</Hyperlink>
</TextBlock>
가장 간단한 방법은 다음에서 상속 된 새로운 컨트롤을 사용하는 것입니다 Hyperlink
.
/// <summary>
/// Opens <see cref="Hyperlink.NavigateUri"/> in a default system browser
/// </summary>
public class ExternalBrowserHyperlink : Hyperlink
{
public ExternalBrowserHyperlink()
{
RequestNavigate += OnRequestNavigate;
}
private void OnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;
}
}
참고도 그 Hyperlink
탐색에 사용 할 필요가 없습니다. 명령에 연결할 수 있습니다.
예를 들면 다음과 같습니다.
<TextBlock>
<Hyperlink Command="{Binding ClearCommand}">Clear</Hyperlink>
</TextBlock>
재사용 가능한 핸들러에 대한 Arthur의 아이디어를 좋아했지만 더 간단한 방법이 있다고 생각합니다.
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
if (sender.GetType() != typeof (Hyperlink))
return;
string link = ((Hyperlink) sender).NavigateUri.ToString();
Process.Start(link);
}
모든 종류의 프로세스를 시작하면 보안 위험이 발생할 수 있으므로주의해야합니다.
이것이 누군가를 돕기를 바랍니다.
using System.Diagnostics;
using System.Windows.Documents;
namespace Helpers.Controls
{
public class HyperlinkEx : Hyperlink
{
protected override void OnClick()
{
base.OnClick();
Process p = new Process()
{
StartInfo = new ProcessStartInfo()
{
FileName = this.NavigateUri.AbsoluteUri
}
};
p.Start();
}
}
}
내 생각에 가장 아름다운 방법 중 하나는 (지금은 일반적으로 사용 가능하기 때문에) 행동을 사용하는 것입니다.
필요합니다 :
- 너겟 의존성 :
Microsoft.Xaml.Behaviors.Wpf
- 이미 내장 된 동작이있는 경우 Microsoft 블로그 에서이 안내서 를 따라야합니다 .
xaml 코드 :
xmlns:Interactions="http://schemas.microsoft.com/xaml/behaviors"
과
<Hyperlink NavigateUri="{Binding Path=Link}">
<Interactions:Interaction.Behaviors>
<behaviours:HyperlinkOpenBehaviour ConfirmNavigation="True"/>
</Interactions:Interaction.Behaviors>
<Hyperlink.Inlines>
<Run Text="{Binding Path=Link}"/>
</Hyperlink.Inlines>
</Hyperlink>
행동 코드 :
using System.Windows;
using System.Windows.Documents;
using System.Windows.Navigation;
using Microsoft.Xaml.Behaviors;
namespace YourNameSpace
{
public class HyperlinkOpenBehaviour : Behavior<Hyperlink>
{
public static readonly DependencyProperty ConfirmNavigationProperty = DependencyProperty.Register(
nameof(ConfirmNavigation), typeof(bool), typeof(HyperlinkOpenBehaviour), new PropertyMetadata(default(bool)));
public bool ConfirmNavigation
{
get { return (bool) GetValue(ConfirmNavigationProperty); }
set { SetValue(ConfirmNavigationProperty, value); }
}
/// <inheritdoc />
protected override void OnAttached()
{
this.AssociatedObject.RequestNavigate += NavigationRequested;
this.AssociatedObject.Unloaded += AssociatedObjectOnUnloaded;
base.OnAttached();
}
private void AssociatedObjectOnUnloaded(object sender, RoutedEventArgs e)
{
this.AssociatedObject.Unloaded -= AssociatedObjectOnUnloaded;
this.AssociatedObject.RequestNavigate -= NavigationRequested;
}
private void NavigationRequested(object sender, RequestNavigateEventArgs e)
{
if (!ConfirmNavigation || MessageBox.Show("Are you sure?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
OpenUrl();
}
e.Handled = true;
}
private void OpenUrl()
{
// Process.Start(new ProcessStartInfo(AssociatedObject.NavigateUri.AbsoluteUri));
MessageBox.Show($"Opening {AssociatedObject.NavigateUri}");
}
/// <inheritdoc />
protected override void OnDetaching()
{
this.AssociatedObject.RequestNavigate -= NavigationRequested;
base.OnDetaching();
}
}
}
참고 URL : https://stackoverflow.com/questions/10238694/example-using-hyperlink-in-wpf
'Programing' 카테고리의 다른 글
Android에서 버튼을 제거하거나 보이지 않게하려면 어떻게해야합니까? (0) | 2020.06.13 |
---|---|
StoryBoard에서 탭 막대 컨트롤러 순서 재정렬 (0) | 2020.06.13 |
Java에서 CamelCase를 사람이 읽을 수있는 이름으로 어떻게 변환합니까? (0) | 2020.06.13 |
UIViewController 위에 clearColor UIViewController 표시 (0) | 2020.06.13 |
meld와 분기의 차이점을 보시겠습니까? (0) | 2020.06.13 |