IronPython WPF с RevitPythonShell

Я написал этот скрипт на основе фрагментов, которые я нашел здесь, в stackoverflow, но получаю эту ошибку во время выполнения:

System.InvalidOperationException: невозможно создать более одного экземпляра System.Windows.Application в одном и том же AppDomain.

Я знаю, что это как-то связано с тем фактом, что последний оператор создает новый экземпляр приложения в том же AppDomain, но я не знаю, как это исправить. Вот сценарий:

clr.AddReference('PresentationCore')
clr.AddReference("PresentationFramework")
clr.AddReference('Microsoft.Dynamic')
clr.AddReference('Microsoft.Scripting')
clr.AddReference('System')
clr.AddReference('IronPython')
clr.AddReference('IronPython.Modules')
clr.AddReference('IronPython.Wpf')
from System.Windows import Application, Window
from IronPython.Modules import Wpf as wpf

class AboutWindow(Window):
    def __init__(selfAbout):
        wpf.LoadComponent( selfAbout, os.path.join( folder, 'AboutWindow.xaml' ))

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

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

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

Это кажется решением, но не знаю, что части этого кода, которые мне нужно исправить.

Вот содержимое двух файлов XAML:

__WIP__wpfTest__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>

__WIP__wpfTest__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> 

person Ehsan Iran-Nejad    schedule 14.08.2015    source источник


Ответы (1)


Согласно msdn, вы должны иметь возможность использовать Window.Show (для немодальной версии) или Window.ShowDialog (если вы хотите остаться в контексте Revit API)

Строка Application().Run( MyWindow() ) в основном устанавливает цикл событий — то, что Revit уже сделал для вас при запуске, так что вы можете просто продолжить и показать свои окна :)

Я не могу протестировать это решение, так как у меня нет AboutWindow.xaml и IronPythonWPF.xaml, поэтому я просто предположил... Попробуйте и расскажите, как все прошло.

person Daren Thomas    schedule 17.08.2015
comment
Хорошо, поэтому я меняю последнюю строку на: MyWindow().Show(), но теперь она говорит мне, что LoadComponent() принимает ровно 3 аргумента (2 заданных)... Он хочет использовать версию функции LoadComponent(Object, Uri). по какой-то причине. - person Ehsan Iran-Nejad; 17.08.2015
comment
на самом деле кажется, что все перегрузки LoadComponent() в wpf требуют объект CodeContext в качестве первого параметра...: | ...Я застрял. - person Ehsan Iran-Nejad; 18.08.2015
comment
да... у меня работает... доказательство: dropbox.com/s/uwpz05o08m5at58/, dropbox.com/s/wtfkz8fmh4i947v/ - person Daren Thomas; 18.08.2015
comment
Хм... Ладно, попробую еще раз. Вы запускали это из окна оболочки RPS? - person Ehsan Iran-Nejad; 18.08.2015
comment
нет, я создал внешний скрипт для запуска вашего кода... интересно, может ли это быть проблемой версии .NET, с которой связан RPS. если я правильно помню, он меняется с RPS 2015 на RPS 2016... - person Daren Thomas; 26.08.2015
comment
Как вы думаете, это может быть как-то связано с тем, как я ссылаюсь на библиотеку IronPython WPF? На моем компьютере сейчас не установлен автономный IronPython, но я использую библиотеки DLL, которые я скопировал из предыдущей установки IronPython (папка с платформами).... Нужно ли мне устанавливать автономный IronPython?? folder = os.path.dirname( __file__ ) sys.path.append( os.path.join( folder, 'platforms\\Net45' )) - person Ehsan Iran-Nejad; 26.08.2015
comment
Я действительно не знаю. Я помню, как переместил dll IronPython.Wpf в GAC. Может быть, это поможет? - person Daren Thomas; 31.08.2015