Browsing the support center I found this nice trick to focus the accordion navigation control with a shortcut.
As always, I decided to (besides bookmark it ?) do a quick post to refer to it later on.
So, let’s see it in action:
public class AccordionNavigationFocusWindowController : WindowController, IMessageFilter
{
const int WM_KEYDOWN = 0x0100;
AccordionControl accordion;
public AccordionNavigationFocusWindowController()
{
TargetWindowType = WindowType.Main;
}
protected override void OnActivated()
{
base.OnActivated();
System.Windows.Forms.Application.AddMessageFilter(this);
Frame.GetController<ShowNavigationItemController>().ShowNavigationItemAction.CustomizeControl += ShowNavigationItemAction_CustomizeControl;
}
private void ShowNavigationItemAction_CustomizeControl(object sender, CustomizeControlEventArgs e)
{
if (e.Control is AccordionControl)
{
accordion = (AccordionControl)e.Control;
((AccordionSearchControl)accordion.GetFilterControl()).NullValuePrompt = "Search (Ctrl+Q)";
}
}
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_KEYDOWN)
{
Keys key = (Keys)m.WParam.ToInt32();
if (key == Keys.Q && Control.ModifierKeys == Keys.Control)
{
((AccordionSearchControl)accordion.GetFilterControl()).Focus();
}
}
return false;
}
}
If we check the code we see a Windows Controller that implements the IMessageFilter interface with the PreFilterMessage method. The purpose of this is to add a message filter to monitor Windows messages and if they meet our shortcut then we focus the navigation control.
Also we added a more user friendly text: “Search (Ctrl+Q)” (as an analogy to Visual Studio) to guide the user.
Source Code here.
See you next time. XAF out!

