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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Innerhalb Ihrer Kontrolle-Vorlage, können Sie einen Trigger setzt, der FocusedElement des StackPanel ist FocusManager das Textfeld Sie wollen konzentriert. Legen Sie die Trigger-Eigenschaft auf {TemplateBinding IsFocused}, so dass es ausgelöst wird, wenn die mit control ist fokussiert.
Wir erhalten möglicherweise eine akzeptierte Antwort hier, wenn Sie könnte, näher auf Ihre Lösung. Ich bin versucht, etwas ähnliches zu tun und ich experimentiere mit deinen Vorschlägen, aber ich bin mir nicht ganz nach, was die trigger-Wert Bindung Aussehen würde, unter anderen details.
InformationsquelleAutor
Können Sie loszuwerden, die harte Codierung von control-Namen in den code, indem Sie einige DependancyProperty und haben den gleichen code in controlLoaded oder OnApplyTemplate-Funktion basierend auf der DependancyProperty.
Diese DependancyProperty Absender wird das für die Kandidaten .Focus () - Aufruf.
InformationsquelleAutor Jobi Joy