4

请耐心等待,我是 GUI 编程、IronPython、WPF 和 .NET 的新手。但是,我对 Python 相当熟悉。我浏览了许多在线教程,但似乎没有一个能解决我面临的确切问题。(也许是微不足道的?但对我这样的人来说,这不是微不足道的!)

问题:我想知道如何从我的 Windows.System.Application 启动新的 WPF 窗口 (XAML) 作为新窗口。基本上,我想从我的应用程序的帮助菜单中启动一个“关于”对话框。我知道这可以通过使用 System.Windows.Forms.Form 来实现,但从长远来看,我希望能够通过使用 XAML 标记来加载更复杂的窗口排列。

目前,当我单击关于菜单 (mnuAboutClick) 时,它会加载 XAML 窗口,但在此过程中会替换/销毁原始主窗口 (WpfMainWindow)。我希望两个窗口都保持打开状态。

编辑:或者,有没有办法将 xaml 加载到 System.Windows.Forms.Form 中?这将适合我的需要。

这是我的代码示例:

import wpf
from System.Windows import Application, Window

class MyWindow(Window):
    def __init__(self):
        wpf.LoadComponent(self, 'WpfMainWindow.xaml')

    def mnuAboutClick(self, sender, e):
        print 'About Menu Click'
        wpf.LoadComponent(self, 'WpfAboutWindow.xaml') # How to launch "About Dialog", This works, but destroys "WpfMainWindow"!

if __name__ == '__main__':
    Application().Run(MyWindow())
4

1 回答 1

6

如果你想同时显示两个窗口,你应该使用Show( msdn ) 或ShowDialog( msdn ) 方法。

例子:

文件“AboutWindow.xaml”:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="AboutWindow" Height="300" Width="300">
    <Grid>
        <TextBlock Text="AboutWindow" />
    </Grid>
</Window>

文件“AboutWindow.py”:

import wpf

from System.Windows import Window

class AboutWindow(Window):
    def __init__(selfAbout):        
        wpf.LoadComponent(selfAbout, 'AboutWindow.xaml')

文件“IronPythonWPF.xaml”:

<Window 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       Title="IronPythonWPF" Height="300" Width="300">
    <StackPanel>
        <Menu>
            <MenuItem Header="About" Click="MenuItem_Click" />
        </Menu>
        <TextBlock Text="MainWindow" />
    </StackPanel>
</Window> 

文件“IronPythonWPF.py”:

import wpf

from System.Windows import Application, Window
from AboutWindow import *

class MyWindow(Window):
    def __init__(self):
        wpf.LoadComponent(self, 'IronPythonWPF.xaml')

    def MenuItem_Click(self, sender, e):   
        form = AboutWindow()
        form.Show()        

if __name__ == '__main__':
    Application().Run(MyWindow())
于 2013-07-06T17:31:18.857 回答