Einstellung Fokus auf ein Steuerelement innerhalb eines ControlTemplate in WPF

In einer Anwendung, an der ich arbeite, haben wir eine Reihe von benutzerdefinierten Steuerelementen, die mit Ihren ControlTemplates definiert im Generischen.xaml.

Beispielsweise unsere eigene textbox würde ähnlich Aussehen wie diese:

<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>

In unserer Anwendung, müssen wir in der Lage sein, um programmgesteuert den Fokus auf ein bestimmtes Steuerelement innerhalb des ControlTemplate.

In unserem C# - code, den wir bekommen können, um die Besondere "FieldTextBox" basierend auf unseren Daten. Sobald wir die richtige FieldTextBox, wir müssen in der Lage sein, um den Fokus auf das eigentliche Textfeld enthalten, in das ControlTemplate.

Die beste Lösung, die ich mir ausgedacht habe, ist zu setzen Sie einen Namen auf der primären Kontrolle in jedem control-Vorlage (in diesem Fall die TextBox), wie "FocusableControl."

Mein code (enthalten in der code-behind für die FieldTextBox) , dann setzen Sie den Fokus auf die Kontrolle wäre:

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

Diese Lösung funktioniert. Allerdings hat jemand anderes kennt eine Lösung, das wäre effizienter als das?

InformationsquelleAutor Bob Wintemberg | 2008-10-01

Schreibe einen Kommentar