В приложении, над которым я работаю, у нас есть несколько пользовательских элементов управления с их шаблонами ControlTemplates, определенными в Generic.xaml.
Например, наше текстовое поле будет выглядеть примерно так:
<Style TargetType="{x:Type controls:FieldTextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:FieldTextBox}">
<Border BorderThickness="0" Margin="5">
<StackPanel ToolTip="{Binding Path=Field.HintText, RelativeSource={RelativeSource TemplatedParent}}">
<TextBlock Text="{Binding Path=Field.FieldLabel, RelativeSource={RelativeSource TemplatedParent}}"
HorizontalAlignment="Left"
/>
<TextBox Width="{Binding Path=Field.DisplayWidth, RelativeSource={RelativeSource TemplatedParent}}"
HorizontalAlignment="Left"
Text="{Binding Path=Field.Data.CurrentValue, RelativeSource={RelativeSource TemplatedParent}}"
IsEnabled="{Binding Path=Field.IsEnabled, RelativeSource={RelativeSource TemplatedParent}}"
ContextMenu="{Binding Source={StaticResource FieldContextMenu}}" >
<TextBox.Background>
<SolidColorBrush Color="{Binding Path=Field.CurrentBackgroundColor, RelativeSource={RelativeSource TemplatedParent}}"/>
</TextBox.Background>
</TextBox>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Focusable" Value="True" />
<Setter Property="IsTabStop" Value="False" />
</Style>
В нашем приложении мы должны иметь возможность программно устанавливать фокус на конкретный элемент управления в шаблоне ControlTemplate.
В нашем C # -коде мы можем получить конкретный «FieldTextBox» на основе наших данных. Как только мы получим правильный FieldTextBox, нам нужно будет установить фокус на фактический TextBox, содержащийся в ControlTemplate.
Лучшее решение, которое я придумал, - это установить имя для основного элемента управления в каждом шаблоне элемента управления (в данном случае это TextBox), например «FocusableControl».
Мой код (содержащийся в коде для FieldTextBox) для установки фокуса на элемент управления будет:
Control control = (Control)this.Template.FindName("FocusableControl", this);
if (control != null)
{
control.Focus();
}
Это решение работает. Однако кто-нибудь еще знает решение, которое было бы более эффективным, чем это?