2010-08-04 58 views
0

使用.NET 4和VS2010親,我已經創建了一個包含在主窗口下面的XAML一個非常簡單的WPF應用程序:取代RichTextBox中的文本菜單

<Grid> 
    <RichTextBox x:Name="richTextBox" 
       Margin="2"/> 
</Grid> 

所有我想這樣做,並且至今在做的時候不成功,是用我自己的替換RichTextBox的ContextMenu。我試着隱藏代碼從MSDN沒有運氣:

public MainWindow() 
    { 
     InitializeComponent(); 
     richTextBox.ContextMenuOpening += new ContextMenuEventHandler(richTextBox_ContextMenuOpening); 
    } 

    private void richTextBox_ContextMenuOpening(object sender, ContextMenuEventArgs e) 
    { 
     RichTextBox rtb = sender as RichTextBox; 
     if (rtb == null) 
     { 
      return; 
     } 

     ContextMenu contextMenu = rtb.ContextMenu; 
     contextMenu.Items.Clear(); 
     MenuItem menuItem = new MenuItem(); 
     menuItem.Header = "Test"; 
     contextMenu.Items.Add(menuItem); 
     contextMenu.PlacementTarget = rtb; 
     contextMenu.Placement = PlacementMode.RelativePoint; 

     TextPointer position = rtb.Selection.End; 

     if (position == null) 
     { 
      return; 
     } 

     Rect positionRect = position.GetCharacterRect(LogicalDirection.Forward); 
     contextMenu.HorizontalOffset = positionRect.X; 
     contextMenu.VerticalOffset = positionRect.Y; 

     contextMenu.IsOpen = true; 
     e.Handled = true; 
    } 

我在什麼我沒有做正確的損失。是否必須在RTB捕捉到MouseDown事件?我是否必須派生自己的RTB版本並覆蓋ContextMenuOpening才能使其發揮作用?這看起來很簡單,但我只是沒有看到它。

在此先感謝。

回答

1

設置ContextMenu屬性對你的RichTextBox爲null之外的東西:

<RichTextBox x:Name="richTextBox" 
      Margin="2"> 
    <RichTextBox.ContextMenu> 
     <ContextMenu/> 
    </RichTextBox.ContextMenu> 
</RichTextBox> 

TextBoxBase,基類的RichTextBox的,有邏輯,能夠自動提供的東西像複製和粘貼的上下文菜單。此邏輯將ContextMenuOpening標記爲已處理,因此不會調用您的處理程序。如果你甚至爲你的RichTextBox分配一個空的ContextMenu,它將單獨離開你的ContextMenu並調用你的處理程序。