Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WFP在具有override DefaultStyleKeyProperty的控件的控件模板中查找控件_C#_Wpf_Inheritance_Metadata_Contenttemplate - Fatal编程技术网

C#WFP在具有override DefaultStyleKeyProperty的控件的控件模板中查找控件

C#WFP在具有override DefaultStyleKeyProperty的控件的控件模板中查找控件,c#,wpf,inheritance,metadata,contenttemplate,C#,Wpf,Inheritance,Metadata,Contenttemplate,我下载了一个示例解决方案,它使用从usercontrol继承但没有.xaml设计文件的控件的DefaultStyleKeyProperty的OverrideMetadata方法,并且它将成为具有类似或几乎相同布局的其他子控件的基控件。 代码可以在这里找到 现在,我试图从基类访问位于其覆盖样式的内容模板中的按钮,名称为“btnTest1”,但我找不到实现此操作的方法 我想知道是否有办法在基类构造函数或子类构造函数(可能在调用InitializeComponent之后)中找到控件,因为我需要在以后的

我下载了一个示例解决方案,它使用从usercontrol继承但没有.xaml设计文件的控件的DefaultStyleKeyProperty的OverrideMetadata方法,并且它将成为具有类似或几乎相同布局的其他子控件的基控件。 代码可以在这里找到

现在,我试图从基类访问位于其覆盖样式的内容模板中的按钮,名称为“btnTest1”,但我找不到实现此操作的方法

我想知道是否有办法在基类构造函数或子类构造函数(可能在调用InitializeComponent之后)中找到控件,因为我需要在以后的代码中访问它

提前谢谢


David.

这有一种风格模式

在control.cs文件中,要覆盖应用程序模板上的

protected override void OnApplyTemplate(){

      Button yourButtonControl = GetTemplateChild("TheNameOfYourButton") as Button;

      base.OnApplyTemplate();
}
  • 如果您想遵循Microsoft模式,那么首先您需要将控件命名为“
    PART\u SomethingButton
    ”。这只是意味着它是一个模板部件

  • 然后在
    Control.cs
    类中,在控件上添加一个
    属性

    • 这告诉任何重写默认样式的人,如果他们希望代码正常工作,他们需要在模板上有一个名为PART\u something Button的
      按钮
  • 在类中,添加一个私有按钮控件。
    • 我们将使用此按钮访问整个控件中的按钮
  • 最后在OnApplyTemplate中设置私有按钮。
    • 这将进入模板,并将按钮缓存在cs文件中,以便我们可以对其进行操作或从中捕获事件

  • 非常感谢你。我通过附加到加载的事件找到了一个解决方案,但我认为覆盖OnApplyTemplate方法是更好的解决方案。@YakumoFujii我发布的方式是专业的方式
    [TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
    public class MyControl : Control
    
    [TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
    public class MyControl : Control{
         private Button _partSomethingButton;
    }
    
    [TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
    public class MyControl : Control{
         private Button _partSomethingButton;
    
        protected override void OnApplyTemplate(){    
              _partSomethingButton = GetTemplateChild("PART_SomethingButton") as Button;   
              base.OnApplyTemplate();
        }
    }