2017-03-06 127 views
0

我正在將焦點集中在用於構建自定義「數字向上」控件的TextBox上。 這是自 「數字向上向下」WPF:自定義控件焦點管理

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

使用

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

我嘗試不同的方法,使其選擇正確的控制,但它總是選擇外層。在我的情況下,網格/邊界。 只有在按TAB之後,纔可以選擇正確的TextBox控件。

有沒有什麼辦法可以在WPF中實現對文本框的關注而不用按TAB?

回答

1

解決:

如果你想專注,你必須建立一個觸發器在一個控件模板內一個TextBox「IsFocused」屬性。 當它變爲true時,您必須將FocusManager.FocusedElement字段設置爲您要關注的文本框(或其他控件)的名稱。

下面是我用來實現這一代碼:

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