Search code examples
.netwpfcommand

WPF Built-in Commands


I'm looking for a complete list of built-in WPF Commands.

The best list I've found so far is here, but it does not list all commands.

Some nice-to-have details would be:

  • Controls/components with support to the commands (for example, TextBox supports edit commands such as Paste, Copy, Cut, Redo, and Undo);

  • Default Key Gestures and UI Text (can be extracted from MSDN Library).


Solution

  • It is easy to display a complete list of all commands in all loaded assemblies:

      public string[] GetAllCommands()
      {
        return (
          from assembly in AppDomain.CurrentDomain.GetAssemblies()
          from type in assembly.GetTypes()
          from prop in type.GetProperties()
          where
            typeof(ICommand).IsAssignableFrom(prop.PropertyType) &&
            prop.GetAccessors()[0].IsStatic
          orderby type.Name, prop.Name
          select type.Name + "." + prop.Name
        ).ToArray();
      }
    

    With PresentationFramework loaded I get the list at the bottom of this answer, which you will see is absolutely complete.

    If you also want to see the command type (eg RoutedUIComand) and gestures, you can add this to the LINQ:

          let commandType = prop.PropertyType
    
          let gestures =
            typeof(UIElement).IsAssignableFrom(commandType) ?
              ((UIElement)prop.GetValue(null)).InputGestures :
            null
    

    Then your select might be something like this:

          select type.Name + "." + prop.Name + " " + commandType.Name + " " + gestures
    

    Programmatically finding out which controls do something with a given command is also possible. Basically something like this ought to work (not tried, but this will give you the idea):

    var allCommands = (
      from assembly in AppDomain.CurrentDomain.GetAssemblies()
      from type in assembly.GetTypes()
      from prop in type.GetProperties()
      where
        typeof(ICommand).IsAssignableFrom(prop.PropertyType) &&
        prop.GetAccessors()[0].IsStatic
      orderby type.Name, prop.Name
      select new
      {
        typeName = type.Name,
        propName = prop.Name,
        displayAs = type.Name + "." + prop.Name,
      }
    ).ToArray();
    
    var classesReferencingCommand = (
      from assembly in AppDomain.CurrentDomain.GetAssemblies()
      from type in assembly.GetTypes()
      from method in type.GetMethods()
      let methodBodyString = ConvertILToString(method.MethodBody.GetILAsByteArray())
      let info = new
      {
        typeName = type.FullName,
        referencedCommands =
          from cmd in allCommands
          where
            methodBodyString.Contains(cmd.typeName) &&
            methodBodyString.Contains(cmd.propName)
          select cmd
      }
      where info.commands.Any()
      select info
    ).ToArray();
    

    where ConvertILToString would probably be something like this:

    static string ConvertILToString(byte[] bytes)
    {
      return new string(bytes.Where(b => b!=0).Select(b => (char)b).ToArray());
    }
    

    The results can be used any way you like, for example they can be displayed using an ItemsControl:

    <ItemsControl Source="{Binding classesReferencingCommand}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <StackPanel>
            <TextBox Text="{Binding typeName}" FontWeight="Bold">
            <ItemsControl Source="{Binding referencedCommands}" Margin="10 0 0 0">
              <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding displayAs}" />
          ... close all tags ...
    

    Alternatively you could output the data in a text or XML format or add it to a database. Also note that this second query can be turned around with the command iteration on the outside if you prefer a listing by command.

    The code above will give you the precise facts and will not lie, because it is looking at the NET Framework itself.

    Here is the promised list of all commands in PresentationFramework:

    ApplicationCommands.CancelPrint
    ApplicationCommands.Close
    ApplicationCommands.ContextMenu
    ApplicationCommands.Copy
    ApplicationCommands.CorrectionList
    ApplicationCommands.Cut
    ApplicationCommands.Delete
    ApplicationCommands.Find
    ApplicationCommands.Help
    ApplicationCommands.New
    ApplicationCommands.NotACommand
    ApplicationCommands.Open
    ApplicationCommands.Paste
    ApplicationCommands.Print
    ApplicationCommands.PrintPreview
    ApplicationCommands.Properties
    ApplicationCommands.Redo
    ApplicationCommands.Replace
    ApplicationCommands.Save
    ApplicationCommands.SaveAs
    ApplicationCommands.SelectAll
    ApplicationCommands.Stop
    ApplicationCommands.Undo
    ComponentCommands.ExtendSelectionDown
    ComponentCommands.ExtendSelectionLeft
    ComponentCommands.ExtendSelectionRight
    ComponentCommands.ExtendSelectionUp
    ComponentCommands.MoveDown
    ComponentCommands.MoveFocusBack
    ComponentCommands.MoveFocusDown
    ComponentCommands.MoveFocusForward
    ComponentCommands.MoveFocusPageDown
    ComponentCommands.MoveFocusPageUp
    ComponentCommands.MoveFocusUp
    ComponentCommands.MoveLeft
    ComponentCommands.MoveRight
    ComponentCommands.MoveToEnd
    ComponentCommands.MoveToHome
    ComponentCommands.MoveToPageDown
    ComponentCommands.MoveToPageUp
    ComponentCommands.MoveUp
    ComponentCommands.ScrollByLine
    ComponentCommands.ScrollPageDown
    ComponentCommands.ScrollPageLeft
    ComponentCommands.ScrollPageRight
    ComponentCommands.ScrollPageUp
    ComponentCommands.SelectToEnd
    ComponentCommands.SelectToHome
    ComponentCommands.SelectToPageDown
    ComponentCommands.SelectToPageUp
    DocumentViewer.FitToHeightCommand
    DocumentViewer.FitToMaxPagesAcrossCommand
    DocumentViewer.FitToWidthCommand
    DocumentViewer.ViewThumbnailsCommand
    EditingCommands.AlignCenter
    EditingCommands.AlignJustify
    EditingCommands.AlignLeft
    EditingCommands.AlignRight
    EditingCommands.Backspace
    EditingCommands.CorrectSpellingError
    EditingCommands.DecreaseFontSize
    EditingCommands.DecreaseIndentation
    EditingCommands.Delete
    EditingCommands.DeleteNextWord
    EditingCommands.DeletePreviousWord
    EditingCommands.EnterLineBreak
    EditingCommands.EnterParagraphBreak
    EditingCommands.IgnoreSpellingError
    EditingCommands.IncreaseFontSize
    EditingCommands.IncreaseIndentation
    EditingCommands.MoveDownByLine
    EditingCommands.MoveDownByPage
    EditingCommands.MoveDownByParagraph
    EditingCommands.MoveLeftByCharacter
    EditingCommands.MoveLeftByWord
    EditingCommands.MoveRightByCharacter
    EditingCommands.MoveRightByWord
    EditingCommands.MoveToDocumentEnd
    EditingCommands.MoveToDocumentStart
    EditingCommands.MoveToLineEnd
    EditingCommands.MoveToLineStart
    EditingCommands.MoveUpByLine
    EditingCommands.MoveUpByPage
    EditingCommands.MoveUpByParagraph
    EditingCommands.SelectDownByLine
    EditingCommands.SelectDownByPage
    EditingCommands.SelectDownByParagraph
    EditingCommands.SelectLeftByCharacter
    EditingCommands.SelectLeftByWord
    EditingCommands.SelectRightByCharacter
    EditingCommands.SelectRightByWord
    EditingCommands.SelectToDocumentEnd
    EditingCommands.SelectToDocumentStart
    EditingCommands.SelectToLineEnd
    EditingCommands.SelectToLineStart
    EditingCommands.SelectUpByLine
    EditingCommands.SelectUpByPage
    EditingCommands.SelectUpByParagraph
    EditingCommands.TabBackward
    EditingCommands.TabForward
    EditingCommands.ToggleBold
    EditingCommands.ToggleBullets
    EditingCommands.ToggleInsert
    EditingCommands.ToggleItalic
    EditingCommands.ToggleNumbering
    EditingCommands.ToggleSubscript
    EditingCommands.ToggleSuperscript
    EditingCommands.ToggleUnderline
    MediaCommands.BoostBass
    MediaCommands.ChannelDown
    MediaCommands.ChannelUp
    MediaCommands.DecreaseBass
    MediaCommands.DecreaseMicrophoneVolume
    MediaCommands.DecreaseTreble
    MediaCommands.DecreaseVolume
    MediaCommands.FastForward
    MediaCommands.IncreaseBass
    MediaCommands.IncreaseMicrophoneVolume
    MediaCommands.IncreaseTreble
    MediaCommands.IncreaseVolume
    MediaCommands.MuteMicrophoneVolume
    MediaCommands.MuteVolume
    MediaCommands.NextTrack
    MediaCommands.Pause
    MediaCommands.Play
    MediaCommands.PreviousTrack
    MediaCommands.Record
    MediaCommands.Rewind
    MediaCommands.Select
    MediaCommands.Stop
    MediaCommands.ToggleMicrophoneOnOff
    MediaCommands.TogglePlayPause
    NavigationCommands.BrowseBack
    NavigationCommands.BrowseForward
    NavigationCommands.BrowseHome
    NavigationCommands.BrowseStop
    NavigationCommands.DecreaseZoom
    NavigationCommands.Favorites
    NavigationCommands.FirstPage
    NavigationCommands.GoToPage
    NavigationCommands.IncreaseZoom
    NavigationCommands.LastPage
    NavigationCommands.NavigateJournal
    NavigationCommands.NextPage
    NavigationCommands.PreviousPage
    NavigationCommands.Refresh
    NavigationCommands.Search
    NavigationCommands.Zoom
    Slider.DecreaseLarge
    Slider.DecreaseSmall
    Slider.IncreaseLarge
    Slider.IncreaseSmall
    Slider.MaximizeValue
    Slider.MinimizeValue
    

    This list is complete.

    If there are any additional gestures in the themes, they can easily be extracted by loading the theme resource dictionary and doing some LINQ on it. The queries are trivial: Just search for <InputGesture>. Update: I don't think there are any gestures in the themes, since the default gestures are loaded from resources. So this part will probably not be necessary.