2009-02-10 24 views
45

मैं बस इतना करना चाहता हूं कि एक्सएएमएल में थोड़ा हाइपरलिंक बनाएं। मैंने सब कुछ करने की कोशिश की है। मैं हार मानता हूं।एक्सएएमएल में एक साधारण हाइपरलिंक कैसे बनाएं?

इसके लिए वाक्यविन्यास क्या है?

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

विजुअल स्टूडियो टीम: दृश्य स्टूडियो 2010 में मैं Clippy पॉप अप और कहते हैं और मुझे बताओ कि यह करने के लिए "यह आप किसी हाइपरलिंक बनाने के लिए कोशिश कर रहे हैं" करना चाहते हैं। क्या आप एमईएफ के साथ ऐसा नहीं कर सकते? यह रेट्रो कूल होगा, और ये छोटे "मैं कैसे कर सकता हूं जो मुझे पहले से ही पता है कि एचटीएमएल में कैसे करना है" मुद्दे XAML के साथ सीखने की प्रक्रिया के दौरान इतना समय जलाते हैं।

+5

+1 - "मैं कैसे मैं पहले से ही पता है कि HTML में क्या करने के लिए कैसे करते हो" मुद्दों XAML के साथ सीखने की प्रक्रिया के दौरान इतना समय तक जला। "-मैन आप गलत नहीं हैं। –

+2

सम्मान के साथ, क्लिप्पी को वीएस में डालना वास्तव में एक बुरा विचार है !! क्या आप कल्पना कर सकते हैं कि आप जो प्रोग्रामिंग कर रहे हैं और अमान्य सुझाव दे रहे हैं उस पर परेशान पेपर क्लिप? मुझे लगता है कि आप इन मुद्दों से बच सकते हैं कूदने से पहले डब्ल्यूपीएफ का अध्ययन करके – MikeKulls

+1

तो आपके साथ वहां; XAML लिखते समय मैं लगातार शोक करता हूं "अगर यह केवल सीएसएस था ..." – nocarrier

उत्तर

35

आप एक कस्टम नियंत्रण टेम्पलेट के साथ एक बटन का उपयोग कर सकते हैं, नीचे दिया गया कोड एक सीमित हाइपरलिंक शैली बटन है (उदाहरण के लिए यह केवल टेक्स्ट हाइपरलिंक्स का समर्थन करता है) लेकिन शायद यह आपको सही दिशा में इंगित करेगा।

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

आमतौर पर, हाइपरलिंक का अर्थ उपयोगकर्ता को किसी अन्य पृष्ठ पर भेजने या आम तौर पर किसी अन्य संसाधन से बात करने के लिए एक एंकर देना होता है, इसलिए इसे इस तरह कार्यान्वित किया जाता है और आपको इस तरह के संसाधन के लिए स्थान निर्दिष्ट करना होगा :

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

हालांकि, मैं यह है कि एक हाइपरलिंक के रूप में इस्तेमाल किया और घटनाओं क्लिक का समर्थन करता है है एक कस्टम TextBlock साथ this blog पद मिल गया है।

+1

यह हाइपरलिंक होना चाहिए, हाइपरलिंक नहीं। – dmo

+0

यह जरूरी नहीं है। e हाइपरलिंक से अनुरोध रद्द करें। निजी शून्य Hyperlink_RequestNavigate (वस्तु प्रेषक, System.Windows.Navigation.RequestNavigateEventArgs ई) { System.Diagnostics.Process.Start (btnHyperlink: – MikeKulls

162

आप स्टैकपैनल में हाइपरलिंक नहीं जोड़ सकते - आपको रनटाइम त्रुटि मिल जाएगी। (दरअसल, मुझे आश्चर्य है कि यह एक संकलन-समय त्रुटि नहीं है।) ऐसा इसलिए है क्योंकि हाइपरलिंक <Button> और <StackPanel> और अन्य चीजें जो स्क्रीन के आयताकार हिस्सों और उतरे हुए हैं, पर WPF के "नियंत्रण" पक्ष में नहीं रहती हैं UIElement से। इसके बजाए, यह <Bold> और <Run> और <Paragraph> और अन्य आम तौर पर टेक्स्ट चीजें जो शब्दों और अनुच्छेदों में शब्द-लपेटने और प्रवाह के साथ "TextElement से उतरते हैं, के साथ" पाठ "पक्ष में रहता है।

एक बार जब आप महसूस करते हैं कि विभिन्न लेआउट व्यवहारों के साथ दो अलग-अलग वर्ग पदानुक्रम हैं, तो यह समझ में आता है कि हाइपरलिंक चीजों के "पाठ" पक्ष पर होगा (उदाहरण के लिए मध्य में हाइपरलिंक के साथ अनुच्छेद करना आसान बनाता है, और उस हाइपरलिंक के लिए भी एक लाइन ब्रेक भरने के लिए)।

लेकिन नहीं, जब आप शुरू कर रहे हैं तो यह खोजा नहीं जा सकता है।

दो दुनिया को मिश्रण करने के लिए, और एक हाइपरलिंक को नियंत्रण के रूप में उपयोग करने के लिए, आपको बस इसे टेक्स्टब्लॉक में रखना होगा। TextBlock एक नियंत्रण-इश बात (यानी, एक StackPanel में जा सकते हैं) है कि पाठ-ish बातें (यानी, एक हाइपरलिंक शामिल कर सकते हैं) शामिल है:

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

हो सकता है कि आप किसी भी चीज़ के लिए बाध्य कर रहे हैं सरल पाठ मानों की तुलना में आपको ContentPresenter का उपयोग करने की आवश्यकता होगी अन्यथा कुछ भी दिखाई नहीं देगा, यह सच हो सकता है यदि आप किसी XML डेटा स्रोत से बाध्यकारी हैं।

IsMouseOver के लिए एक संपत्ति ट्रिगर टेक्स्ट को एक रेखांकित करता है।

एक उदाहरण जहां मैं एक्सएमएल के लिए बाध्यकारी हूं नीचे प्रस्तुत किया गया है।

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

इस प्रयास करें:

<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("http://www.msn.com"); 
} 
+1

कार्य ठीक, एक सुझाव है, अगर हाइपरलिंक btnHyperlink कहा जाता है, तो आप ईवेंट हैंडलर संशोधित कर सकते हैं .NavigateUri.AbsoluteUri); } – dotnetguy

+2

System.Diagnostics.Process.Start (e.Uri.AbsoluteUri) – Ahmad

2

आप बस HyperlinkButton उपयोग कर सकते हैं। जब उस पर क्लिक किया जाता है, यूआरएल अपने वेब ब्राउज़र में प्रदर्शित किया जाएगा:

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

के बारे में क्या यह सिल्वरलाइट –

+0

के साथ काम करता है सार्वभौमिक विंडोज ऐप TargetName के लिए XAML में मान्य नहीं है। केवल NavigateUri और सामग्री का प्रयोग करें। – yehanny

4
<TextBlock> 
    <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate"> 
    <TextBlock Text="{Binding YourText}" /> 
    </Hyperlink> 
</TextBlock> 

यह नेस्टेड TextBlock में किसी भी आबद्ध पाठ linkify होगा, मैं नहीं मिला है अभी तक एक बेहतर तरीका, मैं चाहते हैं यदि संभव हो तो वहां पहला टेक्स्टब्लॉक नहीं होगा। यह डेटा टेम्पलेट्स के लिए भी काम करेगा।

0
mvvmcross साथ UWP में

मैं उपयोग कर रहा हूँ इस

<HyperlinkButton Content="{Binding TextSource, ConverterParameter=MyUrl, Converter={StaticResource Language}, 
      FallbackValue=_MyUrl}" NavigateUri="http://www.google.com" /> 
संबंधित मुद्दे