WPF

2012-04-20 7 views
112

में हाइपरलिंक का उपयोग उदाहरण मैंने कई सुझाव देखे हैं, कि आप Hyperlink नियंत्रण के माध्यम से WPF एप्लिकेशन में हाइपरलिंक जोड़ सकते हैं।WPF

यहाँ है कैसे मैं अपने कोड में इसका इस्तेमाल करने की कोशिश कर रहा हूँ:

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

क्या मैं गलत कर रहा हूँ:

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

मैं निम्न त्रुटि हो रही है?

उत्तर

246

आप अपने आवेदन एक web browser आप RequestNavigate घटना एक समारोह है कि प्रोग्राम के रूप में एक पैरामीटर के रूप पते के साथ एक वेब ब्राउज़र को खोलता है करने के लिए सेट के साथ एक HyperLink जोड़ने की जरूरत में लिंक खोलना चाहते हैं।

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

यह आपके आवेदन में ऐसा दिखाई देगा।

oO

+4

नोट: '' RequestNavigateEventArgs' System.Windows.Navigation' नाम स्थान में है। – Ben

+2

धन्यवाद, लेकिन बाध्यकारी के माध्यम से लिंक-टेक्स्ट ("इस मामले में यहां क्लिक करें) निर्दिष्ट करने का कोई तरीका है? – Agent007

+5

बस हाइपरलिंक के अंदर एक टेक्स्टब्लॉक डालें और टेक्स्टप्रोपर्टी – KroaX

24

Hyperlink है नहीं एक नियंत्रण है, यह एक flow content तत्व है, आप केवल यह जो प्रवाह सामग्री का समर्थन, एक TextBlock तरह नियंत्रण में उपयोग कर सकते हैं। TextBoxes में केवल सादा पाठ है।

51

फ़ूजी की प्रतिक्रिया के अलावा, हम हैंडलर पुन: प्रयोज्य यह एक संलग्न संपत्ति में बदल कर सकते हैं:

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

मैं इसे पसंद किया एक पुन: प्रयोज्य हैंडलर के आर्थर का विचार, लेकिन मुझे लगता है कि ऐसा करने का एक आसान तरीका है:

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

स्पष्ट रूप से किसी भी प्रकार की प्रक्रिया शुरू करने के साथ सुरक्षा जोखिम हो सकते हैं, इसलिए सावधान रहें।

7

IMHO सबसे आसान तरीका नया नियंत्रण का उपयोग करने के लिए है 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

आप बाद में स्ट्रिंग स्थानीय बनाना चाहते हैं, तो उन प्रश्नों के उत्तर नहीं पर्याप्त हैं, मैं की तरह कुछ सुझाव है:

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

उम्मीद है कि यह किसी को भी मदद करेगा।

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

नोट भी है कि Hyperlink नेविगेशन के लिए प्रयोग की जाने वाली नहीं है। आप इसे कमांड से जोड़ सकते हैं।

उदाहरण के लिए:

<TextBlock> 
    <Hyperlink Command="{Binding ClearCommand}">Clear</Hyperlink> 
</TextBlock> 
संबंधित मुद्दे