Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python.net使用自定义控件构造WPF窗口_Python_Wpf_Python.net - Fatal编程技术网

python.net使用自定义控件构造WPF窗口

python.net使用自定义控件构造WPF窗口,python,wpf,python.net,Python,Wpf,Python.net,我正在尝试使用python.net和WPF在我的应用程序上拥有现代的外观和感觉。 我还想使用该库,使其具有MS Fluent风格 我构建了FluentWPF项目,并在python.net中加载了dll,并构建了一个简单的窗口XAML来加载: import os import clr # add WPF ref, load FluentWPF dll clr.AddReference("wpf\PresentationFramework") dll = os.path.joi

我正在尝试使用python.net和WPF在我的应用程序上拥有现代的外观和感觉。
我还想使用该库,使其具有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>
我试图通过向窗口添加这些对齐来修复它,我认为这将替换库示例中缺少的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窗口作为对话框打开很重要,因为否则开始线程将立即结束。

X:class是代码隐藏类。这就是mywindow,假设python遵循与c#类似的模式。就我个人而言,我使用python作为wpf开发语言的经验并不积极。我只是尝试使用MyWindow,但仍然有错误,它指向第1行char 2,因此x:class甚至还没有到达:(我知道python不会是WPF的最佳体验,但我很好奇是否可以将一个大型PyQT项目转移到WPF:)我将从一个工作解决方案和窗口开始。使用ironpython模板。然后开始添加精细的位。
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()