Focus Scopes

Sometimes, controls need to be grouped into focus scopes so that there is always a logically focused control in that group, irrespective of the actual keyboard focus (there can only be one keyboard focused control in an application at any given time).

Logical Focus

To create a logical focus scope, make a parent control to be include FocusManager.IsFocusScope=“True”:

<StackPanel Name="pnlsideButtonsMain" FocusManager.IsFocusScope="True">
    <Button.../>
    <Button.../>
    <Button Name="btnReports".../>
</StackPanel>

Programmatically, in C#:

StackPanel pnlsideButtonsMain= new StackPanel();  
FocusManager.SetIsFocusScope(pnlsideButtonsMain, true);

To set the focus in a control (eg. a button, in this case called btnReports):

// Sets the focused element in focus scope pnlsideButtonsMain
// pnlsideButtonsMain is a StackPanel.
FocusManager.SetFocusedElement(pnlsideButtonsMain, btnReports);

Focus Styles

To style a control to show keyboard focus and logical focus:

<Style x:Key="ButtonSimpleStyles" TargetType="{x:Type Button}">
    <Setter .../>
    <Setter .../>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border ...
                      x:Name="Border"  
                      CornerRadius="7" 
                      BorderThickness="1"
                      BorderBrush="SteelBlue">                
                      <ContentPresenter 
                        Margin="2"
                        HorizontalAlignment="Center"
                        VerticalAlignment="Center"
                        RecognizesAccessKey="True"/>
                </Border>
                <ControlTemplate.Triggers>
                    <!--Keyboard focus-->
                    <Trigger Property="IsKeyboardFocused" Value="true">
                        <Setter TargetName="Border" Property="BorderBrush" Value="SteelBlue" />
                        <Setter TargetName="Border" Property="Background" Value="{StaticResource MyGlassBlueBrushResource}" />
                        <Setter Property="Foreground" Value="White" />
                    </Trigger>
                    <!--Logical focus (within focus scope)-->
                    <Trigger Property="IsFocused" Value="true">
                        <Setter TargetName="Border" Property="BorderBrush" Value="SteelBlue" />
                        <Setter TargetName="Border" Property="Background" Value="{StaticResource MyGlassBlueBrushResource}" />
                        <Setter Property="Foreground" Value="White" />
                    </Trigger>
                    ...
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>                        
References