2016-11-14 3 views
5

में क्लिक करने योग्य आंशिक पाठ Xamarin फॉर्म में लेबल के पाठ के कुछ हिस्सों को क्लिक करने योग्य, विभिन्न कार्यों को निष्पादित करने, और आदर्श रूप से अलग-अलग स्वरूपण करने का एक तरीका ढूंढ रहा हूं। मैं समझता हूँ कि एक क्लिक करने योग्य लेबल सीधा है और कुछ इस तरह किया जा सकता है:आंशिक पाठ Xamarin लेबल

Label label = new Label { Text = "Click me" }; 
label.Click +=() => { label.Text = "Clicked"; }; 

अनिवार्य रूप से, मैं एक ऐप्लिकेशन है जो मैं देशी Android में किया है में व्यवहार की नकल करने के लिए देख रहा हूँ। मेरे ऐप को एंड्रॉइड और आईओएस और आदर्श यूडब्ल्यूपी के लिए काम करना चाहिए। एंड्रॉइड में, CharSequence ऑब्जेक्ट्स को टेक्स्ट व्यू (लेबल के समान नियंत्रण) में जोड़ा जा सकता है। एंड्रॉयड में, मैं इस तरह एक CharSequence वस्तु बना सकता है:

Runnable doSomething; //equivalent to C# Action; assuming initialized somewhere 
    String myString = "My Clickable String"; //the clickable string 
    Spannable span = Spannable.Factory.getInstance().newSpannable(myString); //this is the clickable text to add to TextView 
     span.setSpan(new ClickableSpan() { 
      @Override 
      public void onClick(View v) { 
       doSomething.run(); //perform the action 
      } 

      @Override 
      public void updateDrawState(TextPaint ds) { 
       ds.setUnderlineText(true); //make underlined 
       ds.setColor(Color.rgb(color.r, color.g, color.b)); //change the color 
       ds.setFakeBoldText(true); //make it bold 
       ds.setTextSize((float) largeFont); //change the text size 
      } 
     }, 0, a.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //style and function for the entire string 

आप देख सकते हैं, यह एक कार्य और शैली गुण होते हैं। इसके बाद मैं इसे टेक्स्ट व्यू में जोड़ सकता हूं (स्पैन करने योग्य उपकरण स्पैन किया गया है जो CharSequence लागू करता है)। मैं चाहता हूं कि गैर-क्लिक करने योग्य स्ट्रिंग्स के अतिरिक्त मैं कई CharSequences जोड़ सकता हूं।

मुझे उम्मीद है कि मैं Xamarin में ऐसा कर सकता हूं लेकिन मुझे अभी तक कोई समाधान नहीं मिला है। मैंने कस्टम प्रस्तुतकर्ताओं की संभावना पर विचार किया है, हालांकि मुझे लगता है कि यदि संभव हो तो क्रॉस-प्लेटफ़ॉर्म समाधान बेहतर होगा। मैं आईओएस के साथ बहुत कम परिचित हूं लेकिन ऐसा लगता है कि एक समान प्रभाव के लिए एक UILabel को NSMutableAttributedString ऑब्जेक्ट्स जोड़ना संभव है। मैंने FancyLabel ऑब्जेक्ट भी देखा है। मुझे पूरा यकीन नहीं है कि मैं यूडब्ल्यूपी के लिए ऐसा कैसे करूंगा क्योंकि मुझे वास्तव में मेरे शोध में बहुत कुछ नहीं मिला।

किसी भी सहायता की बहुत सराहना की जाएगी!

+0

मैं इसे भी समझना चाहूंगा। अंत में मैंने 'टैपगेशर रिकॉग्नाइज़र' का उपयोग करके पूरे लेबल को क्लिक करने योग्य बना दिया। इसके बजाय केवल विशिष्ट शब्द क्लिक करने योग्य होगा। – hvaughan3

+0

व्यक्तिगत रूप से मैं अपना खुद का कस्टम नियंत्रण बनाउंगा, (माईलेबेल: उइलाबेल), फिर मैं रेंज और सीमा के अंत की शुरुआत के लिए दो सार्वजनिक इंट जोड़ दूंगा। तो मैं एक इशारा पहचानकर्ता जोड़ूंगा और स्ट्रिंग सरणी (label.text) में एक टैप की अनुक्रमणिका को बाहर करूँगा और जो भी एक्शन/ईवेंट आप इसे करना चाहते हैं उसे जोड़ दें। यह मेरे सिर के शीर्ष का एक मोटा विचार है। – Digitalsa1nt

+0

यह वर्तमान में X.Forms लेबल के साथ संभव नहीं है। देखें: https://forums.xamarin.com/discussion/26882/formatted-label-with-xamarin-forms। एक लेबल के लिए एक स्वरूपित स्ट्रिंग प्रॉपर्टी है, लेकिन आप पाठ के फ़ॉन्ट, आकार और रंग को केवल बदल सकते हैं, कुछ पाठों के लिंक नहीं जोड़ सकते हैं। टेक्स्टव्यू (एंड्रॉइड)/यूआईएलएबल (आईओएस) के बीच में एक लिंक जोड़ने के प्लेटफार्म विशिष्ट तरीकों का उपयोग करने के लिए आपको कस्टम रेंडरर का उपयोग करने की आवश्यकता होगी। वैकल्पिक रूप से आप शायद स्थानीय HTML लोड के साथ एक वेबव्यू का उपयोग कर सकते हैं? – jgoldberger

उत्तर

1

यह उत्तर वास्तव में बाद में हो सकता है लेकिन भविष्य में दूसरों की मदद कर सकता है।
अपने ViewModel/देखें में:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> //for first few words 
     <ColumnDefinition Width="Auto"/> //the target word 
     <ColumnDefinition Width="Auto"/> //the rest of the string 
    </Grid.ColumnDefitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> //one row for one line of text 
    </Grid.ColumnDefitions> 

    <Label Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Text="First part of string"/> 
    <Label Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="0" Text="TARGET-WORD"> 
     <Label.GestureRecognizers> 
      <TapGestureRecognizer Command="{Binding <YOUR_COMMAND>}"/> 
     </Label.GestureRecognizers> 
    </Label> 
    <Label Grid.Column="2" Grid.ColumnSpan="1" Grid.Row="0" Text="rest of the string"/> 
</Grid> 

यह

मैंने क्या किया और परीक्षण किया है, तो आप एक शब्द के व्यवहार को बदलना चाहते हैं का कहना है कि अपने स्ट्रिंग उचित रूप से विभाजित के साथ एक ग्रिड का उपयोग करने के लिए है जिस तरह से आप ग्रिड के विशिष्ट हिस्सों को अलग कर सकते हैं और व्यवहार/एथेटिक्स में संशोधन कर सकते हैं (डेटा ट्रिगर्स, स्टाइलिंग, इशारे)। याद रखें कि <Span></Span> टैग <Label></Label> की सभी सुविधाओं का समर्थन नहीं करते हैं।

स्पष्ट रूप से, एक्सएएमएल में आपको शब्द की स्थिति जानने की आवश्यकता होगी, या यदि स्ट्रिंग गतिशील है, तो आप गतिशील रूप से इसके लिए खोज कर सकते हैं और कोड के पीछे अपना ग्रिड भी बना सकते हैं।

* Xamarin.Forms 2.3.4.247

1

एक उदाहरण को ध्यान में रखते इस सवाल का जो भविष्य में किसी को मदद मिल सकती है,

उदाहरण के जवाब देने के लिए पर परीक्षण किया गया। मैं लिखने की ज़रूरत कुछ स्वरूपण के साथ "साइन अप करके, आप सेवा की शर्तें और गोपनीयता नीति से सहमत": अलग रंग के साथ सेवाओं के

  1. नियम और उपयोग किया जा सकता है अलग रंग और कर सकते हैं के साथ
  2. गोपनीयता नीति

स्ट्रिंग का शेष भाग सरल होना चाहिए।

XAML में

कोड:

सी # में
`<Label Text="By signing up, you agree to the " Grid.Row="0"/> 
<Label Text="Terms of Services" TextColor="DarkOrange" WidthRequest="150" 
     HorizontalOptions="End" Grid.Row="0"> 
    <Label.GestureRecognizers> 
     <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped_Terms"/> 
    </Label.GestureRecognizers> 
</Label> 
<Label Text=" and " HorizontalOptions="End" Grid.Row="0" /> 
<Label Text="Privacy Policy" TextColor="DarkOrange" HorizontalOptions="Center" 
     VerticalOptions="CenterAndExpand" Grid.Row="0"> 
    <Label.GestureRecognizers> 
     <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped_Policy"/> 
    </Label.GestureRecognizers> 
</Label> 
` 

कोड टैप कॉलबैक के लिए:

private void TapGestureRecognizer_Tapped_Terms(object sender, EventArgs e) 
{ 
    Navigation.PushAsync(new TermsofServicesPage()); 
} 

private void TapGestureRecognizer_Tapped_Policy(object sender, EventArgs e) 
{ 
    Navigation.PushAsync(new PrivacyPolicyPage()); 
} 

स्ट्रिंग के विभिन्न formattings प्रदर्शन किया और पार प्लेटफार्मों के लिए ठीक काम करता है हो सकता है।