WPF MenuItem.Click在父级后失效

4
我将尝试动态填充一个菜单控件(位于控件模板中),并使用各种在代码中创建的菜单项,但我遇到了一些奇怪的问题。如果所有菜单项都被创建为根项,则它们可以成功地触发单击事件。但是,一旦任何菜单项成为另一个菜单项的子项,父项和子项的单击事件都会停止触发。
XAML:
<ControlTemplate>
    <Menu x:Name="MyMenu"/>
</ControlTemplate>

C#:

// This is in the control that the above ControlTemplate is created for
public override void OnApplyTemplate()
{
    base.OnApplyTemplate();

    MenuItem L1 = new MenuItem() { Header = "L1" };
    MyMenu.Items.Add(L1); // Add as root
    L1.Click += new RoutedEventHandler(delegate { MessageBox.Show("L1 Click"); });

    MenuItem L2 = new MenuItem() { Header = "L2" };
    L1.Items.Add(L2); // Add as child of L1.
    // Note: If this is a child of MyMenu, both MenuItems work as expected
    L2.Click += new RoutedEventHandler(delegate { MessageBox.Show("L2 Click"); });
}

菜单显示正确,但是子项的点击事件根本不起作用。如果我在XAML中预定义菜单并在XAML中设置所有的Click事件,它就可以完美地工作 - 但必须在代码中实现,所以这不是一个选项。此外,如果我将'L2'设为'MyMenu'的子项,即使它成为根项,L1和L2也会重新开始工作 - 但我不能把所有东西都作为根项。
我有什么遗漏的吗?
谢谢!
编辑1:
我尝试了一些实验,看看是否在将L1归属于L2并添加它们的Click事件之前,所有东西都已经适当地初始化。仍然没有运气。这是我尝试的内容:
XAML:
<ControlTemplate>
    <Grid>
        <Menu x:Name="MyMenu"/>
        <Button x:Name="MyButton"/>
    </Grid>
</ControlTemplate>

C#:

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();

    MenuItem L1 = new MenuItem() { Header = "L1" };
    MyMenu.Items.Add(L1);

    MenuItem L2 = new MenuItem() { Header = "L2" };
    MyMenu.Items.Add(L2); // Add this to the menu to make sure it gets initialised

    // I created a button so I can make sure that the parenting
    // and events are only added after the MenuItems are loaded
    MyButton.Click += new RoutedEventHandler(MyButton_Clicked);
}

void MyButton_Clicked(object sender, RoutedEventArgs e)
{
    // Note: If these two lines are removed, the events work fine
    MyMenu.Items.Remove(L2);
    L1.Items.Add(L2);

    L1.Click += new RoutedEventHandler(delegate { MessageBox.Show("L1 Click"); });
    L2.Click += new RoutedEventHandler(delegate { MessageBox.Show("L2 Click"); });
}

当窗口加载并显示完毕后,我点击按钮进行父子关系的建立和事件的添加。我看到L2被移动为L1的子元素,但是当我点击它们时,它们不响应点击事件。如果我阻止了父子关系的建立,它们会响应点击事件。我对这种情况感到非常困惑!
编辑2:
我在一个干净的项目中复制了原帖中的所有内容,一切都运行得很完美。所以这不是菜单或菜单项或它们使用的方式的问题。这个问题的原因仍然未知...
编辑3:
按照要求,我在窗口中添加了以下代码进行重新测试:
PreviewMouseLeftButtonDown += new MouseButtonEventHandler(delegate
{
    // Use Ctrl key to enable MessageBox so focus is not lost when opening menu
    if (Keyboard.Modifiers == ModifierKeys.Control)
        MessageBox.Show("Window PreviewMouseLeftButtonDown");
});

当在“死亡”菜单项上按下Ctrl键时,PreviewMouseLeftButtonDown事件总是被触发。它们的点击事件在被父级化后仍然停止工作。目前还没有解决方案或问题的指示...

编辑4:

我进行了以下测试,在L1和L2中添加了以下代码:

L1.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(delegate
{
    MessageBox.Show("L1 PreviewMouseLeftButtonDown"); 
});
// Same for L2

点击后,菜单项L1和L2都会响应PreviewMouseLeftButtonDown事件,但在被父级控件包含后,它们不再响应Click事件。


如果您先构建整个菜单树,然后将 L1 附加到 MyMenu.Items,它是否有效? - Rachel
不,它仍然不起作用。作为一个实验,我创建了一个带有Click事件的按钮,将L2设置为L1的子项,然后设置这两个菜单项的Click事件。这是为了确保这些菜单项在添加父级和处理程序时已经完全加载。但一旦有任何父级发生,这两个事件都停止工作了。 - Riaan
为了确保你没有疯掉,你尝试过将处理程序附加到窗口的PreviewMouseLeftButtonDown事件上,以查看是否有任何事件正在冒泡吗? - Chris Wenham
是的,我已经这样做了。我已经将结果添加到我的上面的帖子中。谢谢你的建议。希望这能让我更接近解决这个随机问题。 - Riaan
你是如何从ControlTemplate中访问MyMenu的?我尝试了你上面的示例,L2 Click正常触发。 - CodeNaked
@Rachel,@C. Lawrence Wenham,@CodeNaked: 我解决了这个问题,并在下面发布了我的发现作为答案。谢谢你们的帮助! :) - Riaan
2个回答

2
我终于解决了这个谜团。我追踪到问题出在父控件上,它会在任何点击后窃取焦点,尽管菜单没有焦点,但仍然保持打开状态并响应导航,这很奇怪。删除对Focus()的调用后,一切似乎都正常了。
具体情况如下:
没有MenuItem父级时:
1)我点击根MenuItem,它响应Click事件。
2)OnPreviewMouseDown被父级拦截,并调用Focus()。
在这种情况下,失去焦点不会产生不良结果,因为Click事件成功触发。
有MenuItem父级时:
1)我点击菜单,它打开。
2)OnPreviewMouseDown被父级拦截,并调用Focus()。
3)菜单保持打开状态并继续响应导航(这是否是预期行为?)。
4)当我第二次点击任何MenuItem进行选择时,菜单最终意识到失去了焦点并关闭 - 同时丢弃了点击。
然后,看起来像是MenuItem进行了点击并且被丢弃了... 这就是原始帖子中遇到的问题。

0

我正在为我的书《VB.Net库-第三部分》做一个项目。 我需要做与你尝试的相同的事情。 我遇到了相同的问题。 但是,我通过通过单击按钮创建运行时菜单项来避开这个问题。 我有menu1作为menuStrip项。submenu1_1到submenu1_8作为菜单项。minimenu1_11到minimenu1_18作为子菜单项。我将submenu1_1仅放在非单击类别中。其他所有菜单项都插入到按钮单击事件中(全局声明已在主文件中完成)。现在,如果您单击submneu1_1,则会得到一个输出(我在主多行文本框-Editor中获得它)。单击按钮并获取带有菜单1下拉菜单上的子菜单的微型菜单。相同的原理可以扩展到所有子菜单(使用RadioButtons-激活每个子菜单下拉菜单)。

<Application x:Class="Test_Window"

         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:clr="clr-namespace:System;assembly=mscorlib">
<x:Code>
        <![CDATA[
'''''''''''''''''''''''''''Test_Window_Project
Dim s2 As Window = New Window
Dim Editor As TextBox = New TextBox:Dim btn1 As Button = New Button:Dim tbk1 As TextBlock = New TextBlock
Dim canvas1 As Canvas = New Canvas:Dim ListBox1 As ListBox = New ListBox:Dim ListBox2 As ListBox = New ListBox
Dim DllNumber As TextBox = New TextBox:Dim DllMethodsNumber As TextBox = New TextBox:Dim LoopBox As TextBox = New TextBox
Dim DllName1  As TextBox = New TextBox:Dim btn2 As Button = New Button:Dim tbk2 As TextBlock = New TextBlock
Dim btn3 As Button = New Button:Dim btn4 As Button = New Button:Dim btn5 As Button = New Button
Dim tbk5 As TextBlock = New TextBlock:Dim tbk3 As TextBlock = New TextBlock:Dim tbk4 As TextBlock = New TextBlock
Dim menuStrip As Menu= New Menu
Dim menu1 As MenuItem= New MenuItem
Dim submenu1_1 As MenuItem= New MenuItem:Dim submenu1_2 As MenuItem= New MenuItem
Dim submenu1_3 As MenuItem= New MenuItem:Dim submenu1_4 As MenuItem= New MenuItem
'''''''''''''''''''''''''''''''''''menu1 Additions
Dim minimenu1_11 As MenuItem = New MenuItem:Dim minimenu1_12 As MenuItem= New MenuItem
Dim minimenu1_13 As MenuItem = New MenuItem:Dim minimenu1_14 As MenuItem= New MenuItem
Dim minimenu1_15 As MenuItem = New MenuItem:Dim minimenu1_16 As MenuItem= New MenuItem
Dim minimenu1_17 As MenuItem = New MenuItem:Dim minimenu1_18 As MenuItem= New MenuItem
Dim minimenu1_21 As MenuItem = New MenuItem:Dim minimenu1_22 As MenuItem= New MenuItem
Dim minimenu1_23 As MenuItem = New MenuItem:Dim minimenu1_24 As MenuItem= New MenuItem
Dim minimenu1_25 As MenuItem = New MenuItem:Dim minimenu1_26 As MenuItem= New MenuItem
Dim minimenu1_27 As MenuItem = New MenuItem:Dim minimenu1_28 As MenuItem= New MenuItem
Dim minimenu1_31 As MenuItem = New MenuItem:Dim minimenu1_32 As MenuItem= New MenuItem
Dim minimenu1_33 As MenuItem = New MenuItem:Dim minimenu1_34 As MenuItem= New MenuItem
Dim minimenu1_35 As MenuItem = New MenuItem:Dim minimenu1_36 As MenuItem= New MenuItem
Dim minimenu1_37 As MenuItem = New MenuItem:Dim minimenu1_38 As MenuItem= New MenuItem
Dim minimenu1_41 As MenuItem = New MenuItem:Dim minimenu1_42 As MenuItem= New MenuItem
Dim minimenu1_43 As MenuItem = New MenuItem:Dim minimenu1_44 As MenuItem= New MenuItem
Dim minimenu1_45 As MenuItem = New MenuItem:Dim minimenu1_46 As MenuItem= New MenuItem
Dim minimenu1_47 As MenuItem = New MenuItem:Dim minimenu1_48 As MenuItem= New MenuItem
Sub New()
s2.Width=1020:s2.Height=840:s2.Background=Brushes.Yellow:s2.Content=canvas1:s2.Left=0:s2.Top=0
s2.Title="Goodluck_Dll_Analyser":Dim uriSource = New Uri("D:\DllMaster\Goodluck.ico", UriKind.Relative)
s2.Icon = New BitmapImage(uriSource):s2.Name="Goodluck_Dll_Analyser"
''''''''''''''''''''''''''''''''''''''''menu1 Properties
menuStrip.Items.Add(menu1):menu1.Name = "menu1":menu1.Margin=New Thickness(0,0,0,0)
menu1.Header= "T.Menu":menu1.FontWeight=FontWeights.UltraBold:menu1.FontSize="14"
menu1.Foreground=Brushes.White:menu1.Width=80:menu1.Background=Brushes.Brown
''''''''''''''''''''''''''''''''''''''
Editor.TextWrapping=TextWrapping.Wrap:Editor.AcceptsReturn = True:Editor.Width=1000:Editor.Height=723
Editor.Margin=New Thickness(0,74,0,0)
Editor.Background=New SolidColorBrush(Colors.White):Editor.Foreground=New SolidColorBrush(Colors.Navy)
Editor.FontSize=16:Editor.FontWeight=FontWeights.UltraBold:Editor.HorizontalScrollBarVisibility=ScrollBarVisibility.Visible
Editor.VerticalScrollBarVisibility=ScrollBarVisibility.Visible
Editor.HorizontalContentAlignment=HorizontalAlignment.Left
btn1.Width=80:btn1.Height=50:btn1.Margin=New Thickness(0,22,0,0):btn1.Background=New SolidColorBrush(Colors.Navy)
btn1.Content=tbk1:btn1.FontSize="14":btn1.Foreground=New SolidColorBrush(Colors.White):tbk1.InLines.Add("Dim_1_1")
btn1.HorizontalAlignment=System.Windows.HorizontalAlignment.Left:tbk1.TextAlignment = TextAlignment.Center
tbk1.FontStretch=FontStretches.UltraExpanded:tbk1.FontStyle=FontStyles.Italic:tbk1.Typography.SlashedZero=True
tbk1.FontWeight=FontWeights.UltraBold:tbk1.FontFamily=New FontFamily("Century Gothic"):tbk1.LineHeight=Double.NaN
tbk1.TextWrapping=TextWrapping.Wrap:tbk1.Typography.NumeralStyle=FontNumeralStyle.OldStyle
tbk1.Padding = New Thickness(5, 10, 5, 10)
btn4.Width=80:btn4.Height=50:btn4.Margin=New Thickness(246,22,0,0):btn4.Background=New SolidColorBrush(Colors.Red)
btn4.Content=tbk4:btn4.FontSize="14":btn4.Foreground=New SolidColorBrush(Colors.White):tbk4.InLines.Add("Close")
btn4.HorizontalAlignment=System.Windows.HorizontalAlignment.Left:tbk4.TextAlignment = TextAlignment.Center
tbk4.FontStretch=FontStretches.UltraExpanded:tbk4.FontStyle=FontStyles.Italic:tbk4.Typography.SlashedZero=True
tbk4.FontWeight=FontWeights.UltraBold:tbk4.FontFamily=New FontFamily("Century Gothic"):tbk4.LineHeight=Double.NaN
tbk4.TextWrapping=TextWrapping.Wrap:tbk4.Typography.NumeralStyle=FontNumeralStyle.OldStyle
tbk4.Padding = New Thickness(5, 10, 5, 10)
btn5.Width=80:btn5.Height=50:btn5.Margin=New Thickness(328,22,0,0):btn5.Background=New SolidColorBrush(Colors.Navy)
btn5.Content=tbk5:btn5.FontSize="14":btn5.Foreground=New SolidColorBrush(Colors.White):tbk5.InLines.Add("AllClear")
btn5.HorizontalAlignment=System.Windows.HorizontalAlignment.Left:tbk5.TextAlignment = TextAlignment.Center
tbk5.FontStretch=FontStretches.UltraExpanded:tbk5.FontStyle=FontStyles.Italic:tbk5.Typography.SlashedZero=True
tbk5.FontWeight=FontWeights.UltraBold:tbk5.FontFamily=New FontFamily("Century Gothic"):tbk5.LineHeight=Double.NaN
tbk5.TextWrapping=TextWrapping.Wrap:tbk5.Typography.NumeralStyle=FontNumeralStyle.OldStyle
tbk5.Padding = New Thickness(5, 10, 5, 10)
canvas1.Children.Add(Editor):canvas1.Children.Add(btn1):canvas1.Children.Add(ListBox1)
canvas1.Children.Add(btn4):canvas1.Children.Add(btn5):canvas1.Children.Add(menuStrip)
menu1.Items.Add(submenu1_1):submenu1_1.Name = "submenu1_1":submenu1_1.Foreground=Brushes.Brown
submenu1_1.Width=130:submenu1_1.Header= "Action"
s2.Show()
AddHandler btn1.Click,AddressOf btn1Handler
AddHandler btn4.Click,AddressOf btn4Handler:AddHandler btn5.Click,AddressOf btn5Handler
AddHandler submenu1_1.Click,AddressOf submenu1_1Handler
AddHandler submenu1_2.Click,AddressOf submenu1_2Handler
AddHandler submenu1_3.Click,AddressOf submenu1_3Handler
AddHandler submenu1_4.Click,AddressOf submenu1_4Handler
AddHandler minimenu1_11.Click,AddressOf minimenu1_11Handler
AddHandler minimenu1_12.Click,AddressOf minimenu1_12Handler
AddHandler minimenu1_13.Click,AddressOf minimenu1_13Handler
AddHandler minimenu1_14.Click,AddressOf minimenu1_14Handler
End Sub
Private Sub submenu1_1Handler(ByVal sender As Object, ByVal e As RoutedEventArgs)  
    Editor.Text="Hello World!"
End Sub
Private Sub submenu1_2Handler(ByVal sender As Object, ByVal e As RoutedEventArgs)
End Sub
Private Sub submenu1_3Handler(ByVal sender As Object, ByVal e As RoutedEventArgs)
End Sub
Private Sub submenu1_4Handler(ByVal sender As Object, ByVal e As RoutedEventArgs)
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub minimenu1_11Handler(ByVal sender As Object, ByVal e As RoutedEventArgs)
End Sub
Private Sub minimenu1_12Handler(ByVal sender As Object, ByVal e As RoutedEventArgs)
End Sub
Private Sub minimenu1_13Handler(ByVal sender As Object, ByVal e As RoutedEventArgs)
End Sub
Private Sub minimenu1_14Handler(ByVal sender As Object, ByVal e As RoutedEventArgs)
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub btn1Handler(sender As Object,e As RoutedEventArgs)
    Editor.Text &="Hello World!"
menu1.Items.Add(submenu1_2):submenu1_2.Name = "submenu1_2":submenu1_2.Foreground=Brushes.Brown
submenu1_2.Width=130:submenu1_2.Header= "Action"
menu1.Items.Add(submenu1_3):submenu1_3.Name = "submenu1_3":submenu1_3.Foreground=Brushes.Brown
submenu1_3.Width=130:submenu1_3.Header= "Action"
menu1.Items.Add(submenu1_4):submenu1_4.Name = "submenu1_4":submenu1_4.Foreground=Brushes.Brown
submenu1_4.Width=130:submenu1_4.Header= "Action"

submenu1_1.Items.Add(minimenu1_11):minimenu1_11.Header= "New":minimenu1_11.FontSize="12"
minimenu1_11.Foreground=Brushes.White:minimenu1_11.Background=Brushes.DarkSlateBlue
submenu1_1.Items.Add(minimenu1_12):minimenu1_12.Header= "Open":minimenu1_12.FontSize="12"
minimenu1_12.Foreground=Brushes.White:minimenu1_12.Background=Brushes.DarkSlateBlue
minimenu1_12.Width=140:minimenu1_12.Width=140
submenu1_1.Items.Add(minimenu1_13):minimenu1_13.Header= "Close":minimenu1_13.FontSize="12"
minimenu1_13.Foreground=Brushes.White:minimenu1_13.Background=Brushes.DarkSlateBlue
submenu1_1.Items.Add(minimenu1_14):minimenu1_14.Header= "Save":minimenu1_14.FontSize="12"
minimenu1_14.Foreground=Brushes.White:minimenu1_14.Background=Brushes.DarkSlateBlue
minimenu1_13.Width=140:minimenu1_14.Width=140
submenu1_2.Items.Add(minimenu1_21):minimenu1_21.Header= "New":minimenu1_21.FontSize="12"
minimenu1_21.Foreground=Brushes.White:minimenu1_21.Background=Brushes.DarkSlateBlue
submenu1_2.Items.Add(minimenu1_22):minimenu1_22.Header= "Open":minimenu1_22.FontSize="12"
minimenu1_22.Foreground=Brushes.White:minimenu1_22.Background=Brushes.DarkSlateBlue
minimenu1_22.Width=140:minimenu1_22.Width=140
submenu1_2.Items.Add(minimenu1_23):minimenu1_23.Header= "Close":minimenu1_23.FontSize="12"
minimenu1_23.Foreground=Brushes.White:minimenu1_23.Background=Brushes.DarkSlateBlue
submenu1_2.Items.Add(minimenu1_24):minimenu1_24.Header= "Save":minimenu1_24.FontSize="12"
minimenu1_24.Foreground=Brushes.White:minimenu1_24.Background=Brushes.DarkSlateBlue
minimenu1_23.Width=140:minimenu1_24.Width=140
submenu1_2.Items.Add(minimenu1_25):minimenu1_25.Header= "SaveAs":minimenu1_25.FontSize="12"
minimenu1_25.Foreground=Brushes.White:minimenu1_25.Background=Brushes.DarkSlateBlue
submenu1_2.Items.Add(minimenu1_26):minimenu1_26.Header= "Print"
minimenu1_26.Foreground=Brushes.White:minimenu1_26.Background=Brushes.DarkSlateBlue
minimenu1_25.Width=140:minimenu1_26.Width=140
submenu1_2.Items.Add(minimenu1_27):minimenu1_27.Header= "Recent"
minimenu1_27.Foreground=Brushes.White:minimenu1_27.Background=Brushes.DarkSlateBlue
submenu1_2.Items.Add(minimenu1_28):minimenu1_28.Header= "Exit"
minimenu1_28.Foreground=Brushes.White:minimenu1_28.Background=Brushes.DarkSlateBlue
minimenu1_27.Width=140:minimenu1_28.Width=140

submenu1_3.Items.Add(minimenu1_31):minimenu1_31.Header= "New":minimenu1_31.FontSize="12"
minimenu1_31.Foreground=Brushes.White:minimenu1_31.Background=Brushes.DarkSlateBlue
submenu1_3.Items.Add(minimenu1_32):minimenu1_32.Header= "Open":minimenu1_32.FontSize="12"
minimenu1_32.Foreground=Brushes.White:minimenu1_32.Background=Brushes.DarkSlateBlue
minimenu1_32.Width=140:minimenu1_32.Width=140
submenu1_3.Items.Add(minimenu1_33):minimenu1_33.Header= "Close":minimenu1_33.FontSize="12"
minimenu1_33.Foreground=Brushes.White:minimenu1_33.Background=Brushes.DarkSlateBlue
submenu1_3.Items.Add(minimenu1_34):minimenu1_34.Header= "Save":minimenu1_34.FontSize="12"
minimenu1_34.Foreground=Brushes.White:minimenu1_34.Background=Brushes.DarkSlateBlue
minimenu1_33.Width=140:minimenu1_34.Width=140
submenu1_3.Items.Add(minimenu1_35):minimenu1_35.Header= "SaveAs":minimenu1_35.FontSize="12"
minimenu1_35.Foreground=Brushes.White:minimenu1_35.Background=Brushes.DarkSlateBlue
submenu1_3.Items.Add(minimenu1_36):minimenu1_36.Header= "Print"
minimenu1_36.Foreground=Brushes.White:minimenu1_36.Background=Brushes.DarkSlateBlue
minimenu1_35.Width=140:minimenu1_36.Width=140
submenu1_3.Items.Add(minimenu1_37):minimenu1_37.Header= "Recent"
minimenu1_37.Foreground=Brushes.White:minimenu1_37.Background=Brushes.DarkSlateBlue
submenu1_3.Items.Add(minimenu1_38):minimenu1_38.Header= "Exit"
minimenu1_38.Foreground=Brushes.White:minimenu1_38.Background=Brushes.DarkSlateBlue
minimenu1_37.Width=140:minimenu1_38.Width=140

submenu1_4.Items.Add(minimenu1_41):minimenu1_41.Header= "New":minimenu1_41.FontSize="12"
minimenu1_41.Foreground=Brushes.White:minimenu1_41.Background=Brushes.DarkSlateBlue
submenu1_4.Items.Add(minimenu1_42):minimenu1_42.Header= "Open":minimenu1_42.FontSize="12"
minimenu1_42.Foreground=Brushes.White:minimenu1_42.Background=Brushes.DarkSlateBlue
minimenu1_42.Width=140:minimenu1_42.Width=140
submenu1_4.Items.Add(minimenu1_43):minimenu1_43.Header= "Close":minimenu1_43.FontSize="12"
minimenu1_43.Foreground=Brushes.White:minimenu1_43.Background=Brushes.DarkSlateBlue
submenu1_4.Items.Add(minimenu1_44):minimenu1_44.Header= "Save":minimenu1_44.FontSize="12"
minimenu1_44.Foreground=Brushes.White:minimenu1_44.Background=Brushes.DarkSlateBlue
minimenu1_43.Width=140:minimenu1_44.Width=140
submenu1_4.Items.Add(minimenu1_45):minimenu1_45.Header= "SaveAs":minimenu1_45.FontSize="12"
minimenu1_45.Foreground=Brushes.White:minimenu1_45.Background=Brushes.DarkSlateBlue
submenu1_4.Items.Add(minimenu1_46):minimenu1_46.Header= "Print"
minimenu1_46.Foreground=Brushes.White:minimenu1_46.Background=Brushes.DarkSlateBlue
minimenu1_45.Width=140:minimenu1_46.Width=140
submenu1_4.Items.Add(minimenu1_47):minimenu1_47.Header= "Recent"
minimenu1_47.Foreground=Brushes.White:minimenu1_47.Background=Brushes.DarkSlateBlue
submenu1_4.Items.Add(minimenu1_48):minimenu1_48.Header= "Exit"
minimenu1_48.Foreground=Brushes.White:minimenu1_48.Background=Brushes.DarkSlateBlue
minimenu1_47.Width=140:minimenu1_48.Width=140
End Sub
Public Sub btn4Handler(sender As Object,e As RoutedEventArgs)
    Cockpit_Close()
End Sub
Public Sub btn5Handler(sender As Object,e As RoutedEventArgs)
    Editor.Text=""
End Sub
'''''''''''''''''''''''Closing Cockpit_Window from its own Exit_Out Button
Sub Cockpit_Close()
Dim myProcesses() As Process = Process.GetProcesses
    For Each p As Process In myProcesses
        If p.MainWindowTitle.Contains("Goodluck") Then            
            Threading.Thread.Sleep(200)
            p.CloseMainWindow()
            p.Kill()
        End If
    Next
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''
        ]]>
</x:Code>
</Application>

相应的 .vbproj 文件是:

**

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{BE9B3350-5541-4EB5-BD4D-F6938B472E5E}</ProjectGuid>
    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{F184B08F-C81C-45F6-A57F-5ABD9991F28F}</ProjectTypeGuids>
    <OutputType>WinExe</OutputType>
    <RootNamespace>Test_Window</RootNamespace>
    <AssemblyName>Test_Window</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <MyType>Custom</MyType>
    <PublishUrl>publish\</PublishUrl>
    <Install>true</Install>
    <InstallFrom>Disk</InstallFrom>
    <UpdateEnabled>false</UpdateEnabled>
    <UpdateMode>Foreground</UpdateMode>
    <UpdateInterval>7</UpdateInterval>
    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
    <UpdatePeriodically>false</UpdatePeriodically>
    <UpdateRequired>false</UpdateRequired>
    <MapFileExtensions>true</MapFileExtensions>
    <ApplicationRevision>0</ApplicationRevision>
    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
    <IsWebBootstrapper>false</IsWebBootstrapper>
    <UseApplicationTrust>false</UseApplicationTrust>
    <BootstrapperEnabled>true</BootstrapperEnabled>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <DefineDebug>true</DefineDebug>
    <DefineTrace>true</DefineTrace>
    <IncrementalBuild>true</IncrementalBuild>
    <OutputPath>bin\Debug\</OutputPath>
    <DocumentationFile>Test_Window.xml</DocumentationFile>
    <NoWarn>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314</NoWarn>
  </PropertyGroup>
  <ItemGroup>    
    <Reference Include="System.Core" />
    <Reference Include="System.Drawing" />
    <Reference Include="system.windows.controls.ribbon" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Windows" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
    <Reference Include="System.Xaml">
      <RequiredTargetFramework>4.0</RequiredTargetFramework>
    </Reference>
    <Reference Include="UIAutomationProvider" />
    <Reference Include="UIAutomationTypes" />
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
  </ItemGroup>
  <ItemGroup>
    <ApplicationDefinition Include="Test_Window.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </ApplicationDefinition>
  </ItemGroup>
  <ItemGroup>    
    <Imports Include="System.Drawing.Bitmap" />
    <Imports Include="System.MarshalByRefObject" />
    <Imports Include="System.Drawing.Icon" />
    <Import Include="System.Windows.Shapes" />
    <Import Include="System.Attribute" />
    <Import Include="System.Collections.Generic" />
    <Import Include="System.Collections" />
    <Import Include="System.ComponentModel" />
    <Import Include="System.Data" />
    <Import Include="System.Diagnostics" />
    <Import Include="System.Drawing" />
    <Import Include="System.Linq" />           
    <Import Include="Microsoft.VisualBasic" />
    <Import Include="Microsoft.Win32" />
    <Import Include="System.Net" />
    <Import Include="System.Net.WebClient" />
    <Import Include="System 'STAThread" />
    <Import Include="System.Windows.Application" />
    <Import Include="System.Object" />
    <Import Include="System.Reflection" />
    <Import Include="System.Runtime.InteropServices" />
    <Import Include="System.IO" />
    <Import Include="System" />
    <Import Include="System.Web" />
    <Import Include="System.Windows" />
    <Import Include="System.Windows.Forms" />
    <Import Include="System.Windows.Automation.Peers" />
    <Import Include="System.Windows.Controls" />
    <Import Include="System.Windows.Data" />
    <Import Include="System.Windows.Documents" />
    <Import Include="System.Windows.Input" />
    <Import Include="System.Windows.Media" />
    <Import Include="System.Windows.Media.Imaging" />
    <Import Include="System.Windows.Navigation" />
    <Import Include="System.Windows.Shapes" />
    <Import Include="System.Windows.Threading" />
    <Import Include="System.Windows.Threading.DispatcherTimer" />
    <Import Include="System.Text" />
    <Import Include="System.Threading" />
    <Import Include="System.Threading.Tasks" />
    <Import Include="System.Xml" />
    <Import Include="System.Xml.Linq" />
  </ItemGroup>  
  <ItemGroup>
    <BootstrapperPackage Include=".NETFramework,Version=v4.5">
      <Visible>False</Visible>
      <ProductName>Microsoft .NET Framework 4.5 %28x86 and x64%29</ProductName>
      <Install>true</Install>
    </BootstrapperPackage>
    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
      <Visible>False</Visible>
      <ProductName>.NET Framework 3.5 SP1</ProductName>
      <Install>false</Install>
    </BootstrapperPackage>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
</Project>

**

命令行编译调用方式如下:

msbuild.exe C:\Users\YourName\Desktop\Test\Test_Window.vbproj /t:ReBuild C:\Users\YourName\Desktop\Test\bin\Debug\Test_Window.exe

测试:首先点击T.Menu,编辑器中会显示“Hellow World!”。 然后点击Dim1_1按钮,您将看到完整的下拉菜单。 祝好!

Venkatraman


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接