2017-03-06 2 views
0

Ich bin zu binden, um Fokus auf eine TextBox setzen verwendet, um eine benutzerdefinierte "Numeric Up Down" -Steuerelement zu erstellen. Dies ist der Brauch "Numeric Up Down"WPF: Benutzerdefinierte Steuerung Fokus-Management

<Style x:Key="SpinButton" TargetType="Slider" > 
    <Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="Slider"> 
    <Border Grid.RowSpan="3" BorderThickness="1,1,1,1" BorderBrush="WhiteSmoke"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width=".5*"/> 
      <ColumnDefinition Width=".5*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height=".5*"/> 
      <RowDefinition Height=".5*"/> 
     </Grid.RowDefinitions> 
     <TextBox Name="textBoxNumericUpDown" Grid.RowSpan="3" Margin="2,0,0,0"   Text="{Binding Value,Mode=TwoWay, RelativeSource={RelativeSource  TemplatedParent}}" FontSize="20" VerticalAlignment="Center" Background=" {x:Null}" Foreground="White" BorderThickness="0" CaretBrush="White"  IsTabStop="True"/> 
     <RepeatButton Grid.Column="1" Grid.Row="0" Margin="0,0,-5,0"  Command="Slider.IncreaseLarge" Style="{StaticResource TimeRepeatButtonStyle}" Content="+" Background="{x:Null}" BorderBrush="White" Foreground="White"  FontSize="18" Cursor="Hand" Width="44" Height="44" IsTabStop="False"/> 
     <RepeatButton Grid.Column="1" Grid.Row="1" Command="Slider.DecreaseLarge"  Margin="0,1,-5,0" Style="{StaticResource TimeRepeatButtonStyle}" Content="-"  Background="{x:Null}" BorderBrush="White" Foreground="White" FontSize="18"  Cursor="Hand" Width="44" Height="44" IsTabStop="False"/> 
    </Grid> 
    </Border> 
    </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Nutzungs

<Slider PreviewTextInput="textBoxTimeMinute_PreviewTextInput" Name="textBoxTimeMinute" Width="100" Style="{StaticResource SpinButton}" Maximum="999" Margin="8" HorizontalAlignment="Left" Minimum="0" IsTabStop="True" TabIndex="0"/> 
<Label Grid.Column="1" Content=":" VerticalAlignment="Center" IsTabStop="False"/> 
<Slider PreviewTextInput="textBoxTimeSecond_PreviewTextInput" Grid.Column="2" Name="textBoxTimeSecond" Width="100" Style="{StaticResource SpinButton}" Maximum="60" Margin="8" HorizontalAlignment="Left" Minimum="-1" IsTabStop="True" TabIndex="1"/> 

Wanted result (Automatic focus on the first textbox if no number inside)

Wanted result (Automatic focus on the first textbox if number inside, number is selected)

ich verschiedene Arten versucht, es die richtige Kontrolle zu machen wählen, aber es immer wählt die äußere Ebene aus. In meinem Fall Das Gitter/Grenze. Erst nachdem ich TAB gedrückt habe, kann ich das richtige TextBox Control auswählen lassen.

Gibt es eine Möglichkeit in WPF kann ich den Fokus auf Textbox erreichen, ohne TAB zu drücken?

Antwort

1

Gelöst:

Wenn Sie Sie einen Text in einem Control konzentrieren möchten haben einen Trigger auf der „IsFocused“ Eigenschaft einzurichten. Wenn dies zutrifft, müssen Sie das Feld FocusManager.FocusedElement auf den Namen der TextBox (oder eines anderen Steuerelements) festlegen, die Sie fokussieren möchten.

Unten ist der Code, den ich dies zu erreichen verwendet:

<ControlTemplate TargetType="Slider"> 
<TextBox x:Name="TextBoxToFocus"/> //The textbox(or any other element) I want to set focus to. It is very important to have it named, otherwise I won't know which control to focus. 
<ControlTemplate.Triggers> //The trigger 
     <Trigger Property = "IsFocused" Value = "True" /> //The property the trigger is watching 
      <Setter TargetName="TextBoxToFocus" Property="FocusManager.FocusedElement" Value="{Binding ElementName=NumericUpDown}"/> //Setter when the trigger executes 
     </Trigger> 
</ControlTelmplate.Triggers> 

Verwandte Themen