我想在這裏做的是以下幾點:
- 單獨創建上下文菜單,並將其分配給每一個「連接」對象的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));
}
}
}
}
這是它的樣子:


希望這有助於
在深入學習使用代碼背後的WPF之前,請考慮學習MVVM模式。 WPF顯着更容易與MVVM一起使用。如果你以前從未使用過它,這是一個非常大的心理變化,所以要爲學習曲線做好準備。你稍後會感謝你。 –
謝謝你的擡頭。我對WPF非常陌生,很難讓我的頭腦在.xaml和.xaml文件夾中。但現在我只是堅持完成這個最終的WPF項目。 – StraightUp