2012-07-16 197 views
1

是否可以將上下文菜單附加到wpf控件,並在左鍵單擊時打開它(而不是更常見的右鍵單擊)?我只想用xaml來實現這一點(這應該是我的控件的視圖模板的一部分)。wpf上下文菜單左鍵單擊

回答

0
  1. 創建以編程方式打開子菜單的方法,因爲這SO文章中指出: Show menu programmatically in WPF

  2. 創建LeftMouseButtonDown事件並調用該事件在XAML。

+0

不會從代碼違反視圖和邏輯之間的分離嗎?對我來說這部分屬於視圖(所以應該在xaml中指定)。 – 2012-07-17 20:45:21

+0

這是作爲視圖一部分的視圖的代碼隱藏。你所指的是關於在ViewModel中實現這個代碼,我根本沒有建議。 – Xcalibur37 2012-07-17 22:06:34

+0

好吧,就這樣吧。但仍然,我不明白「爲LeftMouseButtonDown創建事件並調用該方法」部分。我在Generic.xaml中有一個用於控制的樣式。當我點擊這種風格中定義的控件之一時,我想要顯示上下文菜單。圖像控制。所以我試圖將MouseUp =「method」添加到Image標籤中,但是我得到:error MC4007:無法在樣式中的Target標籤上指定事件'MouseUp'。改用EventSetter。如何在風格中連接事件處理程序?我的方法應該放在哪裏? Generic.xaml.cs? – 2012-07-18 20:18:39

4

這裏是我會怎麼做的一個簡單的例子,我的建議:

的XAML:

<Window x:Class="LeftClickMenu.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow"> 
    <Grid> 
     <Border Width="400" Height="300" Background="#ccc" BorderBrush="#333" 
       BorderThickness="1" 
       MouseLeftButtonDown="Border_MouseLeftButtonDown" 
       MouseRightButtonUp="Border_MouseRightButtonUp"> 
      <Border.ContextMenu> 
       <ContextMenu x:Name="myContextMenu"> 
        <MenuItem Header="Menu Item 1" /> 
        <MenuItem Header="Menu Item 2" /> 
        <MenuItem Header="Menu Item 3" /> 
        <MenuItem Header="Menu Item 4" /> 
        <MenuItem Header="Menu Item 5" /> 
       </ContextMenu> 
      </Border.ContextMenu> 
     </Border> 
    </Grid> 
</Window> 

和代碼隱藏:

using System.Windows; 
using System.Windows.Input; 

namespace LeftClickMenu 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      myContextMenu.IsOpen = true; 
     } 

     private void Border_MouseRightButtonUp(object sender, MouseButtonEventArgs e) 
     { 
      e.Handled = true; 
     } 
    } 
} 

我還增加了額外的MouseRightButtonUp事件來禁止右鍵單擊c彈出上下文菜單。

+0

(對不起,延遲迴復。)但是,如何將這種行爲轉換爲樣式(例如在Generic.xml中)。正如我以前的評論中指出的那樣,我得到了「錯誤MC4007:事件'MouseUp'不能在樣式中的Target標籤上指定,而是使用EventSetter。」 – 2012-07-25 18:26:53

+0

我同意這個錯誤。您應該使用事件設置器。我不相信有一種有效的方式可以做到這一點,因爲您需要在特定事件中發生這種情況。 – Xcalibur37 2012-07-26 15:59:47

4

這裏是顯示在左側單擊上下文菜單的方式:

Border元素上創建一個新的左按鈕處理程序:

<Border x:Name="Win" 
     Width="40" 
     Height="40" 
     Background="Purple" 
     MouseLeftButtonUp="UIElement_OnMouseLeftButtonUp"> 

再補充一點:

private void UIElement_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 

    var mouseDownEvent = 
     new MouseButtonEventArgs(Mouse.PrimaryDevice, 
      Environment.TickCount, 
      MouseButton.Right) 
     { 
      RoutedEvent = Mouse.MouseUpEvent, 
      Source = Win, 
     }; 


    InputManager.Current.ProcessInput(mouseDownEvent); 
} 

它的功能,它基本上將左鍵單擊到右鍵單擊。爲了可重用性,您可以將其包裝爲附加行爲。

+0

謝謝,這是我發現的唯一解決方案,它尊重您在ContextMenuService.Placement ...屬性中指定的內容。 – 2017-07-12 09:34:54

相關問題