python - python.net用自定义控件构造WPF窗口
问题描述
我正在尝试使用 python.net 和 WPF 在我的应用程序上拥有现代的外观和感觉。
我还想使用FluentWPF库为其赋予 MS Fluent 风格。
我构建了 FluentWPF 项目并在 python.net 中加载了 dll,并构建了一个简单的窗口 XAML 来加载:
import os
import clr
# add WPF ref, load FluentWPF dll
clr.AddReference("wpf\PresentationFramework")
dll = os.path.join(os.getcwd(), r"FluentWPF-master\FluentWPF\bin\Debug\net45\FluentWPF.dll")
clr.AddReference(dll)
from SourceChord.FluentWPF import *
from System import Exception
from System.IO import *
from System.Windows.Markup import XamlReader, ParserContext
from System.Windows import *
from System.Threading import Thread, ThreadStart, ApartmentState
from System.Windows.Controls import *
class MyWindow(Window):
def __init__(self):
try:
stream = StreamReader("window.xaml")
ctx = ParserContext()
ctx.XmlnsDictionary.Add("fw", "clr-namespace:SourceChord.FluentWPF;assembly=FluentWPF")
self.window = XamlReader.Load(stream.BaseStream, ctx)
Application().Run(self.window)
except Exception as e:
print(e.Message)
# start app
thread = Thread(ThreadStart(MyWindow))
thread.SetApartmentState(ApartmentState.STA)
thread.Start()
thread.Join()
窗口 XAML:
<fw:Window x:Class="Window"
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:fw="clr-namespace:SourceChord.FluentWPF;assembly=FluentWPF"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="AcrylicWindow"
Width="300"
Height="300"
mc:Ignorable="d">
<Grid Background="#70FFFFFF">
<TextBlock Margin="10"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Text="This is AcrylicWindow"
TextWrapping="Wrap" />
</Grid>
</fw:Window>
这是我到目前为止所拥有的,但是当我运行这段代码时,我得到了错误:
'Cannot create unknown type '{clr-namespace:SourceChord.FluentWPF;assembly=FluentWPF}Window'.' Line number '1' and line position '2'.
我试图通过将这些 lignes 添加到 Window ctor 来修复它,认为它将替换库示例中使用的缺失 App.xaml:
ctx = ParserContext()
ctx.XmlnsDictionary.Add("fw", "clr-namespace:SourceChord.FluentWPF;assembly=FluentWPF")
在 App.xml 中也有这一行:
<ResourceDictionary Source="pack://application:,,,/FluentWPF;component/Styles/Controls.xaml" />
这是我也可以通过 ParserContext 注入的东西吗?或者我错过了什么?我对 WPF 还不是很熟悉。
解决方案
clr.AddReference("TestWpfProjectForPython")
from TestWpfProjectForPython import MainWindow
def app_thread():
sb = MainWindow()
sb.ShowDialog()
from System.Threading import ApartmentState, Thread, ThreadStart
thread = Thread(ThreadStart(app_thread))
thread.SetApartmentState(ApartmentState.STA)
thread.Start()
thread.Join()
将 WPF 窗口作为对话框打开很重要,否则启动线程会立即结束。
推荐阅读
- php - 如何在 Symfony 4 本地 Web 服务器上启用 HTTPS
- c# - 使用 XML 中的某个节点过滤结果
- python - 如何在指定时间后运行 post_save 信号?
- r - 4 列的宽数据框到 3 列的长数据框
- powershell - 如何从 Azure DataFactory 运行 Powershell?.ps1 文件
- reactjs - 在哪些情况下我应该在反应中使用上下文以及它是如何工作的?
- javascript - Mongo shell:列出所有声明的变量
- android - 我如何在android中设置防火墙要求
- javascript - 使用 Java 库从动态网站中提取内容
- laravel - 在laravel mongodb的where子句中连接两列以进行搜索