防止在继承控制中应用原始模板



我想从商业库中包含的控件(Scichart(中的控件中得出自己的自定义控件。

我正在覆盖applytemplate,如以下代码中的那样,但是遇到了一个问题,当调用 GetAndAssertTemplateChild时(库中的函数与 GetTemplateChild几乎相同,但如果结果等于null,则会引发和错误(该零件在模板中找不到。

在研究此问题时,我发现onapplytemplate被称为多次,首先将其称为"控制模板",然后使用新控件的模板召回。有什么方法可以避免这种情况,并且永远不要应用基类模板。

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    AnnotationRoot = GetAndAssertTemplateChild<Grid>("PART_LineAnnotationRoot");
    _line = GetAndAssertTemplateChild<Line>("PART_Line");
    _ghostLine = GetAndAssertTemplateChild<Line>("PART_GhostLine");
    _label = GetAndAssertTemplateChild<TextBlock>("PART_Label");
}

是否有任何方法可以避免这种情况,并且永远不要应用基类模板

如果您只想调用派生类的' OnApplyTemplate()方法,则应避免在被压制方法中调用基类'方法:

public override void OnApplyTemplate()
{
    //DON't CALL THIS ONE: base.OnApplyTemplate();
    AnnotationRoot = GetAndAssertTemplateChild<Grid>("PART_LineAnnotationRoot");
    _line = GetAndAssertTemplateChild<Line>("PART_Line");
    _ghostLine = GetAndAssertTemplateChild<Line>("PART_GhostLine");
    _label = GetAndAssertTemplateChild<TextBlock>("PART_Label");
}

,如果您想从头开始提供默认的自定义ControlTemplate,则应在控制类中定义静态构造函数:

static YourControl()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(YourControl),
        new FrameworkPropertyMetadata(typeof(YourControl)));
}

...并在ResourceDictionary中定义默认模板,称为" generic.xaMl",位于一个名为"主题"的文件夹中的"主题",该文件夹定义了控制类的根文件夹中。

相关内容

  • 没有找到相关文章

最新更新