【问题标题】:Creating Markup Extension with Converter使用转换器创建标记扩展
【发布时间】:2013-06-17 04:55:04
【问题描述】:

我正在尝试创建一个标记扩展,它将采用 HTML 字符串,将其转换为 FlowDocument,然后返回 FlowDocument。我对创建标记扩展相当陌生,我希望这对有更多经验的人来说是显而易见的。这是我的代码:

[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 错误列表:

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

【问题讨论】:

  • 能否也发布相关的 XAML?
  • 问题是什么?有什么不工作吗?
  • 错误 1 ​​和 2 似乎很明显。只需添加一个默认构造函数。那么错误 3 或许只是后续。
  • 尝试完全移除构造函数;无论如何,您的 Source 属性有一个公共设置器。
  • @sthotakura 那就更好了。

标签: c# wpf converter markup-extensions


【解决方案1】:

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

  1. 删除你的特定构造函数(无论如何你设置Source 直接)
  2. 如果您删除Source= 部分,则更改您HtmlToXamlExtension 的调用,然后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

希望对你有帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      它帮助我安装了 .NET 4.7(开发包),我在 .NET 4.6 中看到过这个错误,但升级后它就消失了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-19
        • 2019-03-28
        • 1970-01-01
        • 2021-10-10
        • 2021-01-30
        • 2020-07-07
        • 1970-01-01
        • 2012-01-08
        相关资源
        最近更新 更多