2016-07-03 5 views
1

を.RTFするRichEditBoxバインディング:これは私が扱っていたオブジェクトであるファイル

class TopNews 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public string ImageURI { get; set; } 
    public string BodyUri { get; set; } 
} 

BodyURIは、たとえば、.rtfファイルを保持しているAzureブロブのアドレスの文字列になるだろう:https://richeditbox.blob.core.windows.net/testformat.rtfは可能な文字列で、BodyURIです。

これは、これまでの私のXAMLのレイアウトです:

<ListView Grid.Row="1"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Image /> 
        <RichEditBox TextWrapping="WrapWholeWords" 
           IsReadOnly="True" 
           IsColorFontEnabled="True"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

それは多くのことを行方不明、しかし、私がやりたいことは、私のRichEditBox制御にAzureブロブストレージでその.rtfファイルのアップの内容をバインドすることです私のXAMLレイアウトで。

これまで私がこれまで行ってきた研究のすべてが、間にいくつかのプロセスが必要であることを示しています。

richEditBox.Document.SetText(TextSetOptions.FormatRtf, await cBlob.DownloadTextAsync()); 

Uri bloburi = new Uri("https://richeditbox.blob.core.windows.net/testformat.rtf"); 
CloudBlockBlob cBlob = new CloudBlockBlob(bloburi); 
  • は、私はまた、リッチテキストボックスにその.rtfファイルの内容をロードする方法を発見:

    1. 私はブロブのダウンロードを設定する必要があります

      どうすればいいですか?私は、私はこの1つのように、新しいクラスを作成することができることを考えていた:私は、.rtfファイルのダウンロードのプロセスを実行し、ちょうどRichEditBoxでそれを設定することができるよう、

      class TopNewsProcessed 
      { 
          public string Id { get; set; } 
          public string ImageURI { get; set; } 
          public string Title { get; set; } 
          public RichEditBox Body { get; set; } 
      } 
      

      が、私は見当もつかないこれをXAMLレイアウトのRichEditBoxにバインドする方法。これは良いアイデアですか?もしそうなら、私はどのように縛るのですか? BodyRichEditBoxから別のものに変更する必要がありますか?

  • +0

    は多分これが役立ちますhttps://social.msdn.microsoft.com/Forums/en-US/f9a83d4e-26e9-476b-8818-7ccdf91a2341/richeditbox-mvvm-pattern?forum= winappswithcsharp – Ian

    答えて

    4

    私は、.rtfファイルのダウンロードのプロセスを実行し、ちょうどRichEditBoxでそれを設定し、私は私のXAMLレイアウト

    にRichEditBoxにこれを結合アプローチするか見当もつかないできるようにするため 添付プロパティを作成

    このlink

    にBabaAndThePigmanが提供するソリューションに基づいて、正しい方向である私はあなたのシナリオの添付プロパティを変更:

    public class RtfText 
    { 
        public static string GetRichText(DependencyObject obj) 
        { 
         return (string)obj.GetValue(RichTextProperty); 
        } 
    
        public static void SetRichText(DependencyObject obj, string value) 
        { 
         obj.SetValue(RichTextProperty, value); 
        } 
    
        // Using a DependencyProperty as the backing store for RichText. This enables animation, styling, binding, etc... 
        public static readonly DependencyProperty RichTextProperty = 
         DependencyProperty.RegisterAttached("RichText", typeof(string), typeof(RtfText), new PropertyMetadata(string.Empty, callback)); 
    
        private static async void callback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
        { 
         var reb = (RichEditBox)d; 
         Uri bloburi = new Uri((string)e.NewValue); 
         CloudBlockBlob cBlob = new CloudBlockBlob(bloburi); 
         var blobstr = await cBlob.DownloadTextAsync(); 
         reb.Document.SetText(TextSetOptions.FormatRtf, blobstr); 
        } 
    } 
    

    モデルの場合、BodyUri文字列プロパティを変更する必要はありません。

    ビュー:

    <ListView ItemsSource="{Binding Data}"> 
         <ListView.ItemTemplate> 
          <DataTemplate> 
           <StackPanel> 
            <TextBlock Text="{Binding Title}" /> 
            <StackPanel Orientation="Horizontal"> 
             <RichEditBox local:RtfText.RichText="{Binding BodyUri}" 
                TextWrapping="WrapWholeWords" 
                IsColorFontEnabled="True"/> 
            </StackPanel> 
           </StackPanel> 
    
          </DataTemplate> 
         </ListView.ItemTemplate> 
        </ListView> 
    

    は、あなたのビューで、RichEditBoxのIsReadOnlyプロパティが "" に設定し、これはこのラインで "アクセスが拒否されました" 例外が発生しますことに注意してください: RichEditBox.Document.SetText(...)

    here

    に私の完成サンプルをご確認ください

    スクリーンショット: screenshot

    +0

    ありがとうございました!これは多くを助けた – CStruggle

    関連する問題