2016-11-14 16 views
5

Xamarinフォームでラベルのテキストの一部をクリック可能にし、別の機能を実行し、理想的には異なる書式を使用する方法を探しています。私はネイティブのAndroidでやったアプリで動作を模倣しているよ、基本的にXamarinで部分テキストをクリック可能ラベル

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

:私は、クリック可能なラベルが簡単であり、このような何かを行うことができることを理解しています。私のアプリはAndroidとiOS、理想的にはUWPで動作する必要があります。 Androidでは、CharSequenceオブジェクトをTextView(Labelと同様のコントロール)に追加できます。 Androidでは、次のような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 

ご覧のとおり、関数を実行し、スタイル属性を持ちます。これをTextViewに追加することができます(SpannableはCharSequenceを実装するSpannedを実装しています)。私が望むように、クリックできないストリングに加えて、複数のCharSequenceを追加することができます。

私はXamarinでこれを行うことができる方法を望んでいますが、まだ解決策が見つかりませんでした。可能であれば、クロスプラットフォームのソリューションが望ましいと感じていますが、私はカスタムレンダラの可能性を考えました。私ははるかにiOSに精通していませんが、NSMutableAttributedStringオブジェクトをUILabelに追加して同様の効果が得られるようです。私はまた、FancyLabelオブジェクトを見てきました。私は私の研究で実際にはあまり見つけられなかったので、UWPのためにこれをどうやってやるのかは分かりません。

ご協力いただければ幸いです。

+0

私はこのことを理解したいと思います。私は最終的にあきらめて、 'TapGestureRecognizer'を使ってラベル全体をクリック可能にしました。むしろ特定の言葉だけをクリック可能にすることが多いでしょう。 – hvaughan3

+0

個人的には独自のカスタムコントロール(MyLabel:UILabel)を作成し、範囲の開始と範囲の終了に2つのpublic intを追加します。ジェスチャーレコグナイザーを追加し、文字列配列(label.text)のタップのインデックスを作成し、必要なアクション/イベントを追加します。それは私の頭の上の大まかな考えです。 – Digitalsa1nt

+0

これは現在X.Formsラベルでは不可能です。参照:https://forums.xamarin.com/discussion/26882/formatted-label-with-xamarin-forms。 LabelにはFormattedStringプロパティがありますが、テキストのフォント、サイズ、色を変更するだけで、テキストの一部にはリンクを追加することはできません。 TextView(Android)/ UILabel(iOS)の途中にリンクを追加するプラットフォーム固有のメソッドを使用するには、カスタムレンダラーを使用する必要があります。代わりに、ローカルHTMLを読み込んだWebViewを使用することもできます。 – 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> 

この私が行われ、テストされてきた何

は、あなたが単語の動作を変更したいと適切に分割あなたの文字列を使用してグリッドを使用することですグリッドの特定部分を分離し、動作/不具合(データトリガー、スタイリング、ジェスチャー)を修正することができます。 タグは<Label></Label>のすべての機能をサポートしていないことに注意してください。

明らかに、XAMLでは単語の位置を知る必要があります。文字列が動的な場合は、動的に検索し、コードの背後にあるグリッドを構築することもできます。

*将来的に誰かを助けるかもしれない、この質問に答えるために例を考えるとXamarin.Forms 2.3.4.247

1

でテスト、

例えば異なる色でサービスの

  1. 規約と異なる色や缶と
  2. プライバシー・ポリシーをタップすることができます:私はいくつかの書式で「あなたがサービスの利用規約およびプライバシーポリシーに同意し、サインアップすることで、」書く必要があります

残りの文字列は単純である必要があります。XAMLで

コード:C#で

`<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を行い、クロスプラットフォームのために正常に動作することができます。

関連する問題