我正在尝试创建一个标记扩展,它将获取一串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错误列表:
答案 0 :(得分:3)
您实现了没有默认构造函数的MarkupExtension: 所以你有两个选择:
Source
直接)如果删除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
希望它有所帮助。
答案 1 :(得分:0)
你应该为你的标记扩展创建默认构造函数,一切都会好的。
答案 2 :(得分:0)
它帮助我安装了.NET 4.7(开发人员包),我已经在.NET 4.6中看到了此错误,但升级后就消失了。