在WPF中将焦点设置在ControlTemplate中的控件上

在我正在开发的应用程序中,我们有一堆自定义控件,其ControlTemplates在Generic.xaml中定义。

例如,我们的自定义文本框看起来与此类似:

                    

在我们的应用程序中,我们需要能够以编程方式将焦点放在ControlTemplate中的特定控件上。

在我们的C#代码中,我们可以根据我们的数据访问特定的“FieldTextBox”。 一旦我们有了正确的FieldTextBox,我们就需要能够将焦点设置在ControlTemplate中包含的实际TextBox上。

我提出的最佳解决方案是在每个控件模板的主控件上设置一个名称(在本例中为TextBox),例如“FocusableControl”。

我的代码(包含在FieldTextBox的代码隐藏中)然后将焦点设置在控件上将是:

  Control control = (Control)this.Template.FindName("FocusableControl", this); if (control != null) { control.Focus(); } 

该解决方案有效。 但是,是否有其他人知道一种比这更有效的解决方案?

在控件模板中,您可以添加一个Trigger,将StackPanel的FocusManager的FocusedElement设置为您想要聚焦的文本框。 您将Trigger的属性设置为{TemplateBinding IsFocused},以便在关注包含控件时触发它。

您可以通过提供一些DependancyProperty来删除代码中控件名称的硬编码,并在controlLoaded或OnApplyTemplate函数中基于DependancyProperty具有相同的代码。 这个DependancyProperty的发送者将是候选.Focus()调用。