Настройка фокуса на элемент управления в шаблоне ControlTemplate в WPF - PullRequest
3 голосов
/ 01 октября 2008

В приложении, над которым я работаю, у нас есть несколько пользовательских элементов управления с их шаблонами 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();
    }

Это решение работает. Однако кто-нибудь еще знает решение, которое было бы более эффективным, чем это?

Ответы [ 2 ]

2 голосов
/ 01 октября 2008

В вашем шаблоне управления вы можете добавить Trigger, который устанавливает FocusedElement FocusManager StackPanel в текстовое поле, на которое вы хотите сфокусироваться Вы устанавливаете для свойства Trigger значение {TemplateBinding IsFocused}, чтобы оно срабатывало при фокусировке содержащего элемента управления.

0 голосов
/ 01 октября 2008

Вы можете избавиться от жесткого кодирования имени элемента управления в коде, предоставив некоторый DependancyProperty и имея тот же код в функции controlLoaded или OnApplyTemplate, основанной на DependancyProperty. Отправитель этого DependancyProperty будет кандидатом на вызов .Focus ().

...