Невозможно загрузить XAML в powershell - PullRequest
6 голосов
/ 01 июля 2011

У меня есть очень простой скрипт powershell, который загружает макет xaml.Выдает эту ошибку:

Исключение, вызывающее «Load» с аргументом «1»:"не могу создать экземпляр 'Window', определенный всборка 'PresentationFramework, версия = 3.0.0.0,Культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 '.Вызывающий поток должен быть STA, потому что это требуется для многих компонентов пользовательского интерфейса."

Я несколько раз просматривал сценарий и файлы xaml, но не вижу, в чем проблема, и не помогает, что я не до конца понимаю, в чем ошибка.Получаю средства либо.Любая помощь приветствуется.Спасибо.

Скрипт Powershell:

Add-Type -AssemblyName presentationframework
$xaml = [xml](Get-Content MainWindow.xaml)
$reader = New-Object System.Xml.XmlNodeReader $xaml
$form = [Windows.Markup.XamlReader]::Load($reader)
$button = $form.FindName('testButton')
$button.Add_Click({
    $s = $form.FindName('testBox').Text;
    $form.FindName('testLabel').Content = $s;
})
$form.ShowDialog()

Файл Xaml:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480">

    <Grid x:Name="LayoutRoot">
        <TextBox x:Name="testBox" HorizontalAlignment="Left"
                 Margin="26.782,48.626,0,0" TextWrapping="Wrap"
                 Text="New label text" VerticalAlignment="Top" Width="130.22"/>
        <Label x:Name="testLabel" Content="User Search" HorizontalAlignment="Left"
                 Margin="20.666,22.666,0,0" VerticalAlignment="Top"/>
        <Button x:Name="testButton" Content="Change It!" HorizontalAlignment="Left"
                 Margin="26.782,85,0,0" VerticalAlignment="Top" Width="75"/>
    </Grid>
</Window>

Ответы [ 3 ]

6 голосов
/ 01 июля 2011

Эту ошибку я называю «потому что я так сказал», и это означает именно то, что говорится.

Вы не можете загрузить XAML в Powershell.exe, потому что это STA.И «многие» компоненты требуют этого.Мои многочисленные, я имею в виду WPF.

К счастью, каждый хост PowerShell поддерживает STA

  • powershell.exe -sta (включает режим STA)
  • Интегрированная среда сценариев Powershell(STA по умолчанию)
  • PowerGUI (STA по умолчанию)
  • PowerShellPlus (удерживайте нажатой клавишу Shift при запуске, чтобы включить STA)
  • PrimalScript (это флажок на верхней панели)
  • PowerSE / PowerWF (скоро будет STA)

Хотя существует гораздо более простой способ написания пользовательского интерфейса в PowerShell.Вы должны проверить showui.codeplex.com .

Надеюсь, это поможет,

2 голосов
/ 01 июля 2011

@ BrandonRisell, посмотрите ShowUI модуль PowerShell, помогающий создавать пользовательские интерфейсы WPF в сценарии.

ShowUI делает сложный мир WPF простым в использовании в PowerShell. Вы можете использовать ShowUI для написания простых гаджетов WPF, быстрых внешних интерфейсов для ваших сценариев, компонентов и полных приложений.

0 голосов
/ 01 июля 2011

Это означает, что ваш main () должен быть аннотирован [STAThread], и я не уверен, что это возможно в powershell.
Для получения дополнительной информации о STA vs. MTA см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...