C# WPF 在具有覆盖 DefaultStyleKeyProperty 的控件的控件模板中查找控件

C# WFP Find control in control template of a control with override DefaultStyleKeyProperty

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

现在我试图从基础 class 访问位于其覆盖样式的内容模板中的按钮,名称为 "btnTest1",但我找不到方法这个。

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

提前致谢。

大卫.

有一个样式模式。

在您要覆盖的 control.cs 文件中 OnApplyTemplate

protected override void OnApplyTemplate(){

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

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

  2. 然后在你的Control.csclass控件中添加一个attribute

    • 这告诉覆盖您的默认样式的任何人,如果他们想让您的代码正常工作,他们需要在模板上使用名称为 PART_SomethingButton
    • Button

.

[TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
public class MyControl : Control
  1. 在您的 class 内,添加一个私有 Button 控件。
    • 我们将使用它在整个控件中访问我们的按钮

.

[TemplatePart(Name = "PART_SomethingButton", Type = typeof(Button))]
public class MyControl : Control{
     private Button _partSomethingButton;
}
  1. 最后在您的 OnApplyTemplate 中设置您的私人按钮。
    • 这将进入模板并将按钮缓存在我们的 cs 文件中,以便我们可以对其进行操作或捕获事件。

.

[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();
    }
}