Dot-Net

WPF 內置命令

  • October 15, 2009

我正在尋找內置 WPF 命令的完整列表。

到目前為止我找到的最好的列表是這裡,但它沒有列出所有命令。

一些不錯的細節是:

  • 支持命令的控制項/組件(例如,TextBox支持粘貼、複製、剪切、重做和撤消等編輯命令);
  • 預設按鍵手勢和 UI 文本(可以從MSDN 庫中提取)。

在所有載入的程序集中顯示所有命令的完整列表很容易:

 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();
 }

載入 PresentationFramework 後,我得到了這個答案底部的列表,你會看到它是絕對完整的。

如果您還想查看命令類型(例如 RoutedUIComand)和手勢,可以將其添加到 LINQ:

     let commandType = prop.PropertyType

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

那麼你的選擇可能是這樣的:

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

以程式方式找出哪些控制項對給定命令執行某些操作也是可能的。基本上這樣的事情應該可以工作(沒有嘗試過,但這會給你這個想法):

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();

其中 ConvertILToString 可能是這樣的:

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

結果可以以任何你喜歡的方式使用,例如它們可以使用 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 ...

或者,您可以以文本或 XML 格式輸出數據或將其添加到數據庫中。另請注意,如果您更喜歡按命令列出,則可以使用外部的命令迭代來翻轉第二個查詢。

上面的程式碼將為您提供準確的事實並且不會說謊,因為它正在查看 NET Framework 本身。

這是 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

這份清單是完整的。

如果主題中有任何額外的手勢,可以通過載入主題資源字典並對其進行一些 LINQ 輕鬆提取。查詢很簡單:只需搜尋<InputGesture>. **更新:**我認為主題中沒有任何手勢,因為預設手勢是從資源中載入的。所以這部分可能沒有必要。

引用自:https://stackoverflow.com/questions/1574788