2011-02-23 158 views
3

有什麼辦法在WPF中有效地「別名」命令?我的情況是這樣的:我創建了一個應用程序,該應用程序在具有多個定製畫布的圖形編輯器的上下文中使用ApplicationCommands.Delete。這些畫布上的一些控件使用TextBoxes,但問題如下:TextBox不響應ApplicationCommands.Delete,它響應EditorCommands.Delete。有什麼辦法可以乾淨地讓TextBox響應ApplicationCommands.Delete而無需在每個TextBox實例上創建子類或手動設置綁定?有什麼辦法可以在WPF中別名命令嗎?

回答

2

要回答你的具體問題,我知道沒有辦法導致兩個單獨的路由命令被視爲相同的命令。但是因爲ApplicationCommands.Delete是一個路由命令,所以在它被傳送到它的目標之後,TextBox沒有命令綁定,它將開始冒泡。因此,滿足您要求的最簡單的解決方案是在TextBoxWindow之間的某個位置安裝一個命令綁定,以實現您期望的行爲。

下面是安裝在父Grid一個處理程序,發送「右邊」命令,在這種情況下將是一個TextBox的聚焦元素的例子:

<Grid> 
    <Grid.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.Delete" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed"/> 
    </Grid.CommandBindings> 
    <DockPanel> 
     <Menu DockPanel.Dock="Top"> 
      <MenuItem Header="_Edit"> 
       <MenuItem Header="_Delete" Command="ApplicationCommands.Delete"/> 
      </MenuItem> 
     </Menu> 
     <StackPanel> 
      <TextBox Text="Some text"/> 
     </StackPanel> 
    </DockPanel> 
</Grid> 

和這裏的代碼隱藏:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = true; 
} 

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    EditingCommands.Delete.Execute(null, Keyboard.FocusedElement); 
} 
相關問題