2017-04-21 263 views
3

我正在處理WPF錯誤日誌記錄應用程序,其中當用戶輸入新的連接字符串時,會創建一個連接按鈕並在側邊欄上顯示爲堆疊列表。如何在WPF中右鍵單擊按鈕上下文菜單?

我想在這些連接按鈕上做一個右鍵單擊事件來顯示一個按鈕上下文菜單,用於查看,編輯,刪除的

MainWindow.xaml邊欄格就是這樣的,

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="200"/> 
      <ColumnDefinition Width="318*" /> 

     </Grid.ColumnDefinitions> 
     <ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled"> 
      <StackPanel Name="listConnections" Grid.Column="0" Background="#4682b4" Margin="0,0,0,-0.2" > 
      </StackPanel> 
     </ScrollViewer> 

     </TabControl> 
    </Grid> 

而且我打電話我MainWindow.xaml.cs的Stackpanel listConnections這樣

public MainWindow() 
{ 
    InitializeComponent(); 

    GetUserData(); 
    //Button to create new connection 
    listConnections.Children.Add(new NewConnectionButton(this)); 
    this.Closed += new EventHandler(MainWindow_Close); 
} 

Right-Click event WPF 我試圖按照此鏈接創建右鍵單擊事件,但它不適合我。請有人可以幫助我嗎?

+1

在深入學習使用代碼背後的WPF之前,請考慮學習MVVM模式。 WPF顯着更容易與MVVM一起使用。如果你以前從未使用過它,這是一個非常大的心理變化,所以要爲學習曲線做好準備。你稍後會感謝你。 –

+0

謝謝你的擡頭。我對WPF非常陌生,很難讓我的頭腦在.xaml和.xaml文件夾中。但現在我只是堅持完成這個最終的WPF項目。 – StraightUp

回答

0

你應該把上下文菜單按鈕的資源內,這樣

<NewConnectionButton.Resources> 
    <ContextMenu x:Key="connectionButtonContext" StaysOpen="true"> 
     <MenuItem Header="Add" Click="InternalAddButton_Click"/> 
     <MenuItem Header="Delete" Click="InternalDeleteButton_Click"/> 
     <MenuItem Header="Edit" Click="InternalEditButton_Click"/> 
    </ContextMenu> 
</NewConnectionButton.Resources> 

此代碼應該是NewConnectionButton用戶控件內。在UserControl C#代碼中,訂閱這些事件,並將它們暴露給使用按鈕的人 (InternalAddButton_Click,InternalDeleteButton_Click,InternalEditButton_Click)。然後,在你的MainWindow中訂閱它們。

0

我想在這裏做的是以下幾點:

  • 單獨創建上下文菜單,並將其分配給每一個「連接」對象的UI
  • 手柄MenuItem.Click點擊事件爲每個菜單項
  • 解決在列表中單擊的項目並分別處理它

MVVM和所有那些肯定是好的但這種直接的方法至少是好的pl王牌啓動:

<Window x:Class="WpfApplication7.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <!-- Having CommandParameter is crucial here --> 
     <ContextMenu x:Key="contextMenu"> 
      <MenuItem Header="View" 
         Click="View_OnClick" 
         CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Parent}"/> 
      <MenuItem Header="Edit" 
         Click="Edit_OnClick" 
         CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Parent}" /> 
      <MenuItem Header="Delete" 
         Click="Delete_OnClick" 
         CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Parent}"/> 
     </ContextMenu> 
    </Window.Resources> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="200"/> 
      <ColumnDefinition Width="318*" /> 
     </Grid.ColumnDefinitions> 
     <ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled"> 
      <StackPanel Name="listConnections" Grid.Column="0" Background="#4682b4" Margin="0,0,0,-0.2" > 
       <Button Click="BtnAdd_OnClick">New Connection</Button> 
      </StackPanel> 
     </ScrollViewer> 
    </Grid> 
</Window> 

代碼隱藏:

using System; 
using System.Windows; 
using System.Windows.Controls; 

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

     private static Label FindClickedItem(object sender) 
     { 
      var mi = sender as MenuItem; 
      if (mi == null) 
      { 
       return null; 
      } 

      var cm = mi.CommandParameter as ContextMenu; 
      if (cm == null) 
      { 
       return null; 
      } 

      return cm.PlacementTarget as Label; 
     } 

     private void BtnAdd_OnClick(object sender, RoutedEventArgs e) 
     { 
      listConnections.Children.Add(new Label 
      { 
       Content = "New Connection", 
       ContextMenu = (ContextMenu)Resources["contextMenu"] 
      }); 
     } 

     private void View_OnClick(object sender, RoutedEventArgs e) 
     { 
      var clickedItem = FindClickedItem(sender); 
      if (clickedItem != null) 
      { 
       MessageBox.Show(" Viewing: " + clickedItem.Content); 
      } 
     } 

     private void Edit_OnClick(object sender, RoutedEventArgs e) 
     { 
      var clickedItem = FindClickedItem(sender); 
      if (clickedItem != null) 
      { 
       string newName = "Connection edited on " + DateTime.Now.ToLongTimeString(); 
       string oldName = Convert.ToString(clickedItem.Content); 
       clickedItem.Content = newName; 
       MessageBox.Show(string.Format("Changed name from '{0}' to '{1}'", oldName, newName)); 
      } 
     } 

     private void Delete_OnClick(object sender, RoutedEventArgs e) 
     { 
      var clickedItem = FindClickedItem(sender); 
      if (clickedItem != null) 
      { 
       string oldName = Convert.ToString(clickedItem.Content); 
       listConnections.Children.Remove(clickedItem); 
       MessageBox.Show(string.Format("Removed '{0}'", oldName)); 
      } 
     } 
    } 
} 

這是它的樣子:

about to click edit

after clicking on edit

希望這有助於

+0

P.S. kudos [kenwarner](http://stackoverflow.com/users/55948/kenwarner)[this answer](http:// stackoverflow。com/a/2052782/248406)關於MenuItem中的CommandParameter –

相關問題