IronPython WPF加载新窗口

时间:2013-07-06 16:23:19

标签: python wpf windows user-interface ironpython

请耐心等待,我是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())

1 个答案:

答案 0 :(得分:6)

如果您想同时显示两个窗口,则应使用Showmsdn)或ShowDialogmsdn)方法。

示例:

文件“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())