I have a grid with SAVE button. Then I have a dockmanager which has 2 tabgrouppanes. The first tabgrouppane has a content pane which has a title textbox and few other fields.
Binding for title seems to happen only when we TAB out of the text box. Hitting SAVE without leaving the textbox does not do the binding. How do I get the textbox to receive a "lost focus" when I click on the SAVE button. Attaching sample code.
Thanks.
<Grid> <Grid x:Name="Grid_MenuBar"> <Button x:Name="Save" Grid.Column="1" Grid.Row="0" Margin="5" </Grid>
<igDock:XamDockManager Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <igDock:XamDockManager.Panes> <igDock:SplitPane igDock:XamDockManager.InitialLocation="DockedTop" SplitterOrientation="Horizontal"> <igDock:TabGroupPane> <igDock:ContentPane Header="Primary"> <Grid x:Name="Song"> <TextBlock x:Name="SongTitle_txt" Text="Title" Grid.Row="1" Grid.Column="2" Margin="0,0,5,0" /> <TextBox x:Name="SongTitle_box" BorderThickness="0.5,0.5,0.5,0.5" Grid.Row="1" Grid.Column="3" Text="{Binding Path=Title, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/> </igDock:ContentPane> </igDock:TabGroupPane> </igDock:SplitPane> </igDock:XamDockManager.Panes></Grid>
Actually, it seems to work with the LostKeyboardFocus event even when my ContentPane is floating and even if I click in another floating ContentPane or if I click in any other focus scope.
But now I have a trickier issue. I also have a Winforms control in one of my WPF ContentPane, and I can't get any events from this control before leaving it (it is an UltraWinGrid). I'm afraid in this specific case resetting the FocusedElement of the ContentPane to null will not work. Furthermore, this solution is not applicable to my application because I have a lot of buttons and ContentPane that are dynamically created in my application. So I should handle the FocusedElement resetting in all of them.
tfresnea said:Ok so if I understood well, I have no way to get the EditModeEnding event in time before hitting a button outside of my Focus Scope for instance. Relying on this event is not a good idea, isn't it?
Ok so if I understood well, I have no way to get the EditModeEnding event in time before hitting a button outside of my Focus Scope for instance. Relying on this event is not a good idea, isn't it?
WPF has 2 types of Focus - Keyboard Focus and Logical Focus. These are explained in MS' documentation regarding Focus.
For Keyboard Focus there is only ever 1 element that has keyboard focus - that is the one that is receiving the keyboard input. This is reflected via the Keyboard.FocusedElement property. There are LostKeyboardFocus and GotKeyboardFocus that relate to when an element (or one of its descendants) loses or receives the keyboard focus.
For Logical Focus, every Focus Scope has it's own focused element. This is exposed via the attached FocusManager.FocusedElement. Any element that is marked as a FocusScope (e.g. Window, Toolbar, Menu, Ribbon, ContentPane, etc.) will have its own focused element. The LostFocus and GotFocus events relate to when an element (or one of its descendants) becomes or is no longer the focused element for its containing focus scope. When you shift keyboard focus from one focus scope to another (e.g. click on a menu item, a toolbar, or into another contentpane) then these events are not triggered for the element that had the keyboard focus because it is still the FocusedElement of its containing FocusScope.
So what I was saying was that if you want the LostFocus of an element to occur that you would need to change the FocusedElement of its FocusScope as that is the only time that the WPF framework will raise the GotFocus/LostFocus events. There isn't really an ideal place to do that though especially since I believe the WPF framework will try to change the keyboard focus when you change the focused element of a focus scope. At least for the scenario raised by the original poster, the best option would be to set the UpdateSourceTrigger to PropertyChanged.
Note even if the ContentPane wasn't a FocusScope (and instead it belonged to the focusscope of one of its ancestors - e.g. the Window) you could still have such issues when an element was floating as a Window is a FocusScope and since it has no visual parent it would not cause the LostFocus/GotFocus when shifting keyboard focus between Windows (e.g. between the main window and a floating window).
Hello,
I have the same kind of issue. I don't receive either the EditModeEnding event nor the LostFocus event of a XamNumericEditor defined in a ContentPane when I click in another ContentPane . I didn't get Andrew Smith's answer using FocusManager.FocusedElement. Can anyone explain what I am supposed to do to receive these events?