2012-04-20 13 views
112

Tôi đã xem một số đề xuất, bạn có thể thêm siêu liên kết vào ứng dụng WPF thông qua điều khiển Hyperlink.Ví dụ sử dụng Siêu kết nối trong WPF

Dưới đây là cách tôi đang cố gắng sử dụng nó trong mã của tôi:

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

tôi nhận được lỗi sau:

Property 'Text' does not support values of type 'Hyperlink'.

Tôi đang làm gì sai?

Trả lời

246

Nếu bạn muốn ứng dụng của bạn để mở liên kết trong một web browser bạn cần phải thêm một HyperLink với sự kiện RequestNavigate thiết lập để một chức năng lập trình sẽ mở ra một trình duyệt web với địa chỉ như một tham số.

<TextBlock>   
    <Hyperlink NavigateUri="http://www.google.com" RequestNavigate="Hyperlink_RequestNavigate"> 
     Click here 
    </Hyperlink> 
</TextBlock> 

Trong mã sau, bạn sẽ cần phải thêm một cái gì đó tương tự như thế này để xử lý sự kiện RequestNavigate.

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) 
{ 
    Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); 
    e.Handled = true; 
} 

Ngoài ra, bạn cũng sẽ cần nhập khẩu sau.

using System.Diagnostics; 
using System.Windows.Navigation; 

Nó sẽ giống như thế này trong ứng dụng của bạn.

oO

+4

Lưu ý: 'RequestNavigateEventArgs' là trong' System.Windows.Navigation' namespace. – Ben

+2

Cảm ơn, nhưng có cách nào để chỉ định văn bản liên kết ("Nhấn vào đây" trong trường hợp này) thông qua ràng buộc không? – Agent007

+5

Đơn giản chỉ cần đặt một Textblock bên trong siêu liên kết một lần nữa và ràng buộc Textproperty – KroaX

24

Hyperlinkkhông một điều khiển, nó là một yếu tố flow content, bạn chỉ có thể sử dụng nó trong điều khiển có hỗ trợ nội dung dòng chảy, giống như một TextBlock. TextBoxes chỉ có văn bản thuần túy.

51

Ngoài phản ứng Fuji, chúng tôi có thể làm cho xử lý tái sử dụng biến nó thành một tài sản kèm theo:

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

Và sử dụng nó như thế này:

<TextBlock> 
<Hyperlink NavigateUri="http://stackoverflow.com" custom::HyperlinkExtensions.IsExternal="true"> 
     Click here 
    </Hyperlink> 
</TextBlock> 
3

tôi thích Ý tưởng của Arthur về một trình xử lý có thể tái sử dụng, nhưng tôi nghĩ có một cách đơn giản hơn để làm điều đó:

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) 
{ 
    if (sender.GetType() != typeof (Hyperlink)) 
     return; 
    string link = ((Hyperlink) sender).NavigateUri.ToString(); 
    Process.Start(link); 
} 

Rõ ràng là có thể có rủi ro bảo mật khi bắt đầu bất kỳ loại quy trình nào, vì vậy hãy cẩn thận.

7

IMHO cách đơn giản nhất là sử dụng điều khiển mới thừa hưởng từ 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; 
    } 
} 
14

Nếu bạn muốn để bản địa hoá chuỗi sau, sau đó những câu trả lời là không đủ, tôi sẽ đề nghị một cái gì đó như:

<TextBlock> 
    <Hyperlink NavigateUri="http://labsii.com/"> 
     <Hyperlink.Inlines> 
      <Run Text="Click here"/> 
     </Hyperlink.Inlines> 
    </Hyperlink> 
</TextBlock> 
1

Hy vọng điều này sẽ giúp một người nào đó.

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(); 
     } 
    } 
} 
4

Lưu ý rằng không được sử dụng để điều hướng Hyperlink. Bạn có thể kết nối nó với một lệnh.

Ví dụ:

<TextBlock> 
    <Hyperlink Command="{Binding ClearCommand}">Clear</Hyperlink> 
</TextBlock>