使用转换器创建标记扩展

时间:2013-06-20 10:56:57

标签: c# wpf converter markup-extensions

我正在尝试创建一个标记扩展,它将获取一串HTML,将其转换为FlowDocument,然后返回FlowDocument。我是创建Markup Extensions的新手,我希望这对于有更多经验的人来说是显而易见的。这是我的代码:

[MarkupExtensionReturnType(typeof(FlowDocument))]
public class HtmlToXamlExtension : MarkupExtension
{
    public HtmlToXamlExtension(String source)
    {
        this.Source = source;
    }

    [ConstructorArgument("source")]
    public String Source { get; set; }

    public Type LocalizationResourceType { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (this.Source == null)
        {
            throw new InvalidOperationException("Source must be set.");
        }

        FlowDocument flowDocument = new FlowDocument();
        flowDocument.PagePadding = new Thickness(0, 0, 0, 0);
        string xaml = HtmlToXamlConverter.ConvertHtmlToXaml(Source.ToString(), false);

        using (MemoryStream stream = new MemoryStream((new ASCIIEncoding()).GetBytes(xaml)))
        {
            TextRange text = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
            text.Load(stream, DataFormats.Xaml);
        }

        return flowDocument;
    }
}

更新:这是XAML。

<RadioButton.ToolTip>
    <FlowDocumentScrollViewer Document="{ext:HtmlToXaml Source={x:Static res:ExtrudeXaml.RadioButtonCreateBody_TooltipContent}}" ScrollViewer.VerticalScrollBarVisibility="Hidden" />
</RadioButton.ToolTip>

我的VS错误列表:

  • 错误3解析标记扩展时遇到类型“MS.Internal.Markup.MarkupExtensionParser + UnknownMarkupExtension”的未知属性“Source”。 89号线49号位置。
  • 错误1“HtmlToXamlExtension”类型不包含具有指定数量参数的构造函数。
  • 错误2类型'HtmlToXamlExtension'的构造函数没有0个参数。

3 个答案:

答案 0 :(得分:3)

您实现了没有默认构造函数的MarkupExtension: 所以你有两个选择:

  1. 删除您的特定构造函数(无论如何,您设置Source 直接)
  2. 如果删除HtmlToXamlExtension部分,则更改Source=的调用,然后Wpf将尝试在ext:HtmlToXaml部分之后找到与所有未命名字段匹配的构造函数:

    <RadioButton.ToolTip>
      <FlowDocumentScrollViewer 
             Document="{ext:HtmlToXaml {x:Static res:ExtrudeXaml.RadioButtonCreateBody_TooltipContent}}" 
             ScrollViewer.VerticalScrollBarVisibility="Hidden" />
    </RadioButton.ToolTip>
    

    UPD:即使有效,但MSDN说,you should have default constructor

  3. 希望它有所帮助。

答案 1 :(得分:0)

你应该为你的标记扩展创建默认构造函数,一切都会好的。

答案 2 :(得分:0)

它帮助我安装了.NET 4.7(开发人员包),我已经在.NET 4.6中看到了此错误,但升级后就消失了。