ComboBox LostFocus event fires before GotFocus

6 posts, 0 answers
  1. Brian Scott
    Brian Scott avatar
    11 posts
    Member since:
    Dec 2009

    Posted 27 Feb 2013 Link to this post

    I have a number of WPF RadComboBox controls in a WPF window and am handling the LostFocus event for each one so that I know which field has just been left. However, when a RadComboBox control gets focus via a mouse click it seems to fire a LostFocus event before its GotFocus event, which is causing my code to think it's left a field before it's even got there! This appears to be different behaviour from the other Rad input controls I'm using (e.g. RadWatermarkTextBox, RadDateTimePicker, etc).

    Note that this problem only occurs when changing focus between the fields using mouse clicks. It doesn't appear to occur when navigating between the fields using the Tab key.

    Is this a known bug or am I doing something wrong? Either way, is there a fix or workaround available.

    The following is the xaml and code behind from a sample WPF window I created to highlight the problem...

    <Window x:Class="MainWindow"
            xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
             
            <StackPanel Grid.Row="0"  Height="Auto" HorizontalAlignment="Stretch" Name="StackPanel1" VerticalAlignment="Stretch" Width="Auto">
                <telerik:RadComboBox Name="Combo1" Text="One"
                                     Margin="2" IsEditable="True"
                                     GotFocus="RadComboBox_GotFocus"
                                     LostFocus="RadComboBox_LostFocus">
                    <telerik:RadComboBox.Items>
                        <telerik:RadComboBoxItem>One</telerik:RadComboBoxItem>
                        <telerik:RadComboBoxItem>Two</telerik:RadComboBoxItem>
                        <telerik:RadComboBoxItem>Three</telerik:RadComboBoxItem>
                        <telerik:RadComboBoxItem>Four</telerik:RadComboBoxItem>
                    </telerik:RadComboBox.Items>
                </telerik:RadComboBox>
                <telerik:RadComboBox Name="Combo2" Text="Six"
                                     Margin="2" IsEditable="True"
                                     GotFocus="RadComboBox_GotFocus"
                                     LostFocus="RadComboBox_LostFocus">
                    <telerik:RadComboBox.Items>
                        <telerik:RadComboBoxItem>Five</telerik:RadComboBoxItem>
                        <telerik:RadComboBoxItem>Six</telerik:RadComboBoxItem>
                        <telerik:RadComboBoxItem>Seven</telerik:RadComboBoxItem>
                        <telerik:RadComboBoxItem>Eight</telerik:RadComboBoxItem>
                    </telerik:RadComboBox.Items>
                </telerik:RadComboBox>
                <telerik:RadComboBox Name="Combo3" Text="Eleven"
                                     Margin="2" IsEditable="True"
                                     GotFocus="RadComboBox_GotFocus"
                                     LostFocus="RadComboBox_LostFocus">
                    <telerik:RadComboBox.Items>
                        <telerik:RadComboBoxItem>Nine</telerik:RadComboBoxItem>
                        <telerik:RadComboBoxItem>Ten</telerik:RadComboBoxItem>
                        <telerik:RadComboBoxItem>Eleven</telerik:RadComboBoxItem>
                        <telerik:RadComboBoxItem>Twelve</telerik:RadComboBoxItem>
                    </telerik:RadComboBox.Items>
                </telerik:RadComboBox>
            </StackPanel>
             
            <ListBox Grid.Row="1" Height="Auto" HorizontalAlignment="Stretch" Name="EventList" VerticalAlignment="Stretch" Width="Auto" />
        </Grid>
    </Window>

    Imports Telerik.Windows.Controls
     
    Class MainWindow
     
        Private Sub RadComboBox_GotFocus(sender As System.Object, e As System.Windows.RoutedEventArgs)
            Dim cbo = CType(sender, RadComboBox)
            AddEventToList(cbo.Name, "GotFocus")
        End Sub
     
        Private Sub RadComboBox_LostFocus(sender As System.Object, e As System.Windows.RoutedEventArgs)
            Dim cbo = CType(sender, RadComboBox)
            AddEventToList(cbo.Name, "LostFocus")
        End Sub
     
        Private Sub AddEventToList(ByVal ctrlName As String, ByVal eventName As String)
            EventList.Items.Add(String.Format("{0} : {1} : {2}", EventList.Items.Count, ctrlName, eventName))
            EventList.ScrollIntoView(EventList.Items(EventList.Items.Count - 1))
        End Sub
     
    End Class
  2. Ventzi
    Admin
    Ventzi avatar
    114 posts

    Posted 05 Mar 2013 Link to this post

    Hello Brian,

    I've created a sample project with your code, but I wasn't able recreate the issue that you've described. The first RadComboBox on which I click, fires GotFocus event first. When I then click on the second RadComboBox, the first RadComboBox fires LostFocus and then the second fires GotFocus which is normal behavior in WPF. If you need more info about the focus, please visit this site.

    If you still have this issue, please open a support ticket and provide us a sample project or short video in order to be able to assist you accordingly.


    Greetings,
    Ventzi
    the Telerik team

    Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

  3. UI for WPF is Visual Studio 2017 Ready
  4. John
    John avatar
    7 posts
    Member since:
    Aug 2013

    Posted 09 Dec 2013 Link to this post

    **primary issue resolved by changing mousebuttondown to mousebuttonup event. The item that could be clicked is a rectangle and thus does not have a click event. Not my code initially and I wonder why there is not an image instead - as it is a hierarchical tree for traffic lights and the previous developer used a simple colored rectangle which is fine but not very pretty. Oh well. Good to know that the Lost Focus of one control is NOT fired immediately after losing focus - it was only being fired after the mouse down got taken care of.

    I still would like to know why the LostFocus is fired when the control receives focus....?

    Thanks

    Hello - I am having a very similar problem as this, along with other issues related to the LostFocus property and how it's event handler is fired. First, it is clear that by stepping through code with the VS debugger (VS 2012 Ultimate), that the LostFocus event handler is fired when the control in question RECEIVES focus - and it appears to happen two times!!! In my case this is a RadRichTextBox.

    Additionally, there in another control on the view that has an event handler that gets called before the LostFocus - so my simple question is this: is there a way to prioritize handler calls in WPF?

    I think our application would be unwieldly to try and get you to recreate the situation. If I don't fix it by day's end I will video it and send that.

    But the main question - why does LostFocus fire when the control receives focus, and why does the control I am in (the RTB)'s LostFocus NOT fire before another control's MouseLeftButtonDown event when I leave it?

    (I may have answered part of this: why did the previous developer use MLBD instead of OnClick?) I will try changing that and see what happens....thanks for any tips/help.

    Sincerely,

    John Marno
    Software Developer
    Trihydro Corporation


  5. Rosen Vladimirov
    Admin
    Rosen Vladimirov avatar
    640 posts

    Posted 12 Dec 2013 Link to this post

    Hi John,

    I'm a little bit confused what is the exact issue you are facing which are the controls that you are using. Could you clarify the issue and the problems you have faced? I'm looking forward to hearing from you.

    Regards,
    Rosen Vladimirov
    Telerik
    TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WPF.
    Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
    Sign up for Free application insights >>
  6. John
    John avatar
    7 posts
    Member since:
    Aug 2013

    Posted 12 Dec 2013 Link to this post

    Hi - here is the RTB XAML that you can assume I have just typed some text in to...

    <local:InspectionRichTextbox x:Name="ChildMaintenanceItemDescriptionRTB" HorizontalAlignment="Left" Height="75" Width="600" VerticalAlignment="Stretch" LostFocus="ChildMaintenanceItemDescriptionRTB_LostFocus" RichText="{Binding Description, Mode=TwoWay}" Grid.Row

     

     

     

     

     

     

     

     

     

    ="1" />

    And here is the XAML for the traffic light which the User will sometimes click on before clicking anywhere else. Note that I have already fixed the initial question - I changed the MouseDown to MouseUp and now the LostFocus on the RTB gets called first. However I don't like that initially Leaving the RTB still took a back seat to the MouseDown on the rectangle. FYI the RTB here is behaving strangely. Note the extra lines after the Grid.Row above but when I press delete it adds additional lines? Anyways my main question - how to control precisely the events is still murky, and second question is why does LostFocus get called when the RTB receives focus? I can demonstrate that in the debugger....


    <Rectangle Cursor="Hand" Width="16" ToolTip="Click to set inspection topic to 'Not Inspected' (1)" Height="16" Fill="{Binding BoolCollection, Converter={StaticResource ResourceKey=BrushSelection}}" Stroke="Black" Margin="5,0,0,0" MouseLeftButtonUp="OutOfComplianceRect_MouseLeftButtonUp" x:Name="OutOfComplianceRect"/>

     

     

     

  7. Petya
    Admin
    Petya avatar
    975 posts

    Posted 17 Dec 2013 Link to this post

    Hi,

    We are still a bit confused by your overall scenario. Generally, rectangles are not elements that are focusable, so I am not sure how the LostFocus event is raised in the first place.

    As to why it is raised several times, this is a known issue in RadRichTextBox. It is related to the fact that the caret in the control is represented by a TextBox which receives the focus and gives it to the editor after that. At this point this behavior is not scheduled for resolution and I cannot tell when it might be changed.

    Could you please provide more details on the overall scenario you are trying to achieve? I understand that you are trying to handle some events, but please specify what the end goal is. Maybe we will be able to suggest another approach to satisfy the requirements.

    I'm looking forward to your reply.

    Regards,
    Petya
    Telerik
    TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WPF.
    Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
    Sign up for Free application insights >>
Back to Top
UI for WPF is Visual Studio 2017 Ready