这是我要处理的对象:

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控件。

现在,到目前为止,我对此所做的所有研究都向我表明,当然,两者之间必须有一些过程。


我必须为Blob设置下载:

Uri bloburi = new Uri("https://richeditbox.blob.core.windows.net/testformat.rtf");
CloudBlockBlob cBlob = new CloudBlockBlob(bloburi);

我还发现了如何在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更改为其他内容吗?

最佳答案

这样我就可以运行.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”,这将在此行上导致“访问被拒绝”异常:RichEditBox.Document.SetText(...)

请在here中检查我完成的样本

屏幕截图:
c# - 将RichEditBox绑定(bind)到.rtf文件-LMLPHP

关于c# - 将RichEditBox绑定(bind)到.rtf文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38167355/

10-09 15:07