Jam*_*mes 4 python windows wpf 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())
Run Code Online (Sandbox Code Playgroud)
如果要在同一时间显示两个窗口,则应使用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>
Run Code Online (Sandbox Code Playgroud)
文件"AboutWindow.py":
import wpf
from System.Windows import Window
class AboutWindow(Window):
def __init__(selfAbout):
wpf.LoadComponent(selfAbout, 'AboutWindow.xaml')
Run Code Online (Sandbox Code Playgroud)
文件"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>
Run Code Online (Sandbox Code Playgroud)
文件"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())
Run Code Online (Sandbox Code Playgroud)