【问题标题】:Binding RichEditBox to .rtf files将 RichEditBox 绑定到 .rtf 文件
【发布时间】:2016-07-03 06:32:34
【问题描述】:

这是我正在处理的对象:

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 Blob 的地址,例如: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>

它丢失了很多,但我想做的是将 Azure Blob 存储中的那个 .rtf 文件的内容绑定到我的 XAML 布局中的 RichEditBox 控件。

现在,到目前为止,我在这方面所做的所有研究都表明,当然,这两者之间肯定存在一些过程。

  1. 我必须为 blob 设置下载:

    Uri bloburi = new Uri("https://richeditbox.blob.core.windows.net/testformat.rtf");
    CloudBlockBlob cBlob = new CloudBlockBlob(bloburi);
    
  2. 我还发现了如何在 RichTextBox 上加载该 .rtf 文件的内容:

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

我该怎么做?我在想我可以创建一个新类,比如这个:

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

这样我就可以运行 .rtf 文件的下载过程,然后将其设置在 RichEditBox 中,但我不知道如何将其绑定到我的 XAML 布局上的 RichEditBox。这是一个好主意吗?如果是这样,那么我该如何绑定?我是否必须将BodyRichEditBox 更改为其他内容?

【问题讨论】:

标签: c# data-binding uwp azure-blob-storage uwp-xaml


【解决方案1】:

这样我就可以运行 .rtf 文件的下载过程,然后将其设置在 RichEditBox 中,但我不知道如何将其绑定到我的 XAML 布局上的 RichEditBox

创建一个附加属性是正确的方向,基于BabaAndThePigman在这个link中提供的解决方案@

我为您的场景修改了附加属性:

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

对于Model,无需更改,只保留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 属性设置为“true”,这将导致“Access Denied" 此行异常:RichEditBox.Document.SetText(...)

请在here查看我完成的样本

截图:

【讨论】:

  • 谢谢!这帮助很大
猜你喜欢
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多