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

时间:2017-06-04 02:49:05

标签: c# wpf inheritance styles

我在应用程序中遇到问题,我希望从商业库(scichart)中包含的控件派生自己的自定义控件。

我正在重写OnApplyTemplate,如下面的代码所示,但是遇到了调用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");
}

1 个答案:

答案 0 :(得分:0)

  

有没有办法避免这种情况并且永远不会应用基类模板

如果您只想调用派生类&#39; docker run -v /Users/name/Documents/my-project:/root/my-project -p 9000:9000 -p 8000:8000 -t -i bamos/openface /bin/bash 方法,你应该避免调用基类&#39;重写方法中的方法:

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

...并在名为&#34; generic.xaml&#34;的static YourControl() { DefaultStyleKeyProperty.OverrideMetadata(typeof(YourControl), new FrameworkPropertyMetadata(typeof(YourControl))); } 中定义默认模板。位于名为&#34; Themes&#34;的文件夹中。在定义控件类的项目的根文件夹中。