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>
답변
이 질문에 대한 답변을 사용하여 문제가 발생했습니다.
예외를 반환합니다. {"The system cannot find the file specified."}
약간의 조사 후. WPF 응용 프로그램이 .CORE 인 경우 확인 UseShellExecute
해야 true
합니다.
이것은 Microsoft 문서 에서 언급되었습니다 .
프로세스를 시작할 때 쉘을 사용해야하는 경우 true; 프로세스를 실행 파일에서 직접 작성해야하는 경우 false입니다. 기본값은 .NET Framework 앱에서 true이고 .NET Core 앱에서 false입니다.
따라서이 작업을 수행하려면 다음을 추가해야 UseShellExecute
합니다 true
.
Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri){ UseShellExecute = true });