是否可以將上下文菜單附加到wpf控件,並在左鍵單擊時打開它(而不是更常見的右鍵單擊)?我只想用xaml來實現這一點(這應該是我的控件的視圖模板的一部分)。wpf上下文菜單左鍵單擊
回答
創建以編程方式打開子菜單的方法,因爲這SO文章中指出: Show menu programmatically in WPF
創建LeftMouseButtonDown事件並調用該事件在XAML。
這裏是我會怎麼做的一個簡單的例子,我的建議:
的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彈出上下文菜單。
(對不起,延遲迴復。)但是,如何將這種行爲轉換爲樣式(例如在Generic.xml中)。正如我以前的評論中指出的那樣,我得到了「錯誤MC4007:事件'MouseUp'不能在樣式中的Target標籤上指定,而是使用EventSetter。」 – 2012-07-25 18:26:53
我同意這個錯誤。您應該使用事件設置器。我不相信有一種有效的方式可以做到這一點,因爲您需要在特定事件中發生這種情況。 – Xcalibur37 2012-07-26 15:59:47
這裏是顯示在左側單擊上下文菜單的方式:
的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);
}
它的功能,它基本上將左鍵單擊到右鍵單擊。爲了可重用性,您可以將其包裝爲附加行爲。
謝謝,這是我發現的唯一解決方案,它尊重您在ContextMenuService.Placement ...屬性中指定的內容。 – 2017-07-12 09:34:54
- 1. 上下文菜單左鍵單擊Qt
- 2. 上下文菜單左鍵單擊
- 3. WPF DataGrid:左鍵單擊時顯示動態上下文菜單
- 4. 左鍵點擊上下文菜單
- 5. WPF文本菜單上結合工程右鍵單擊但不左鍵點擊
- 6. jQuery - 左鍵單擊上下文菜單插件
- 7. Chrome右鍵單擊上下文菜單
- 8. 右鍵單擊上下文菜單jquery
- 9. Xpages右鍵單擊上下文菜單
- 10. 右鍵單擊上下文菜單
- 11. JQuery右鍵單擊上下文菜單
- 12. 如何在WPF中右鍵單擊按鈕上下文菜單?
- 13. 在WPF GridView中默認的右鍵單擊上下文菜單
- 14. angular primeng如何顯示左鍵點擊上下文菜單
- 15. WPF DataGrid只在行上左鍵單擊
- 16. 是否有可能檢測到右鍵單擊瀏覽器上下文菜單上的左鍵單擊?
- 17. 告訴TextEdit左鍵單擊「選定的文本」打開上下文菜單
- 18. WPF上下文菜單
- 19. WPF Gridview上下文菜單
- 20. WPF左鍵單擊文本菜單不會對第二次點擊
- 21. 菜單左,右鍵菜單
- 22. VSTO(文檔級):Excel中的單個上下文菜單(右鍵單擊菜單)
- 23. 將上下文菜單左鍵單擊事件添加到通知圖標
- 24. 在JQGrid中,如何在左鍵單擊時顯示上下文菜單?
- 25. 有可能觸發context.js上下文菜單鼠標左鍵單擊
- 26. 禁止在畫布上右鍵單擊上下文菜單
- 27. 在按鈕上的Extjs上下文菜單(右鍵單擊)
- 28. 如何在DataGridView上使用右鍵單擊上下文菜單?
- 29. 如何爲WPF中的按鈕創建右鍵單擊上下文菜單
- 30. 獲取WPF數據網格上下文菜單中單擊行
不會從代碼違反視圖和邏輯之間的分離嗎?對我來說這部分屬於視圖(所以應該在xaml中指定)。 – 2012-07-17 20:45:21
這是作爲視圖一部分的視圖的代碼隱藏。你所指的是關於在ViewModel中實現這個代碼,我根本沒有建議。 – Xcalibur37 2012-07-17 22:06:34
好吧,就這樣吧。但仍然,我不明白「爲LeftMouseButtonDown創建事件並調用該方法」部分。我在Generic.xaml中有一個用於控制的樣式。當我點擊這種風格中定義的控件之一時,我想要顯示上下文菜單。圖像控制。所以我試圖將MouseUp =「method」添加到Image標籤中,但是我得到:error MC4007:無法在樣式中的Target標籤上指定事件'MouseUp'。改用EventSetter。如何在風格中連接事件處理程序?我的方法應該放在哪裏? Generic.xaml.cs? – 2012-07-18 20:18:39