Переменная Xaml в текстовом блоке - PullRequest
0 голосов
/ 27 сентября 2019

Изучая PowerShell, мне предложили решить проблему с Xaml.Совершенно не зная Xaml, я смог построить окно так, как я ожидаю, для моего частного проекта.

Играя с Xaml и приведенным ниже кодом, я смог сгенерировать окно ипоместите стол в этом.Идея заключается в том, что цикл будет создавать таблицу и пока она еще выполняется.

Clear-Host
$Test = "Vocabulary Test Results"

$AnotherTest = '<TextBlock FontWeight="Bold" Margin="10" FontFamily="Arial" FontSize="28" Foreground="Blue" HorizontalAlignment="Center" Text="$Test" />  <Separator />'

#Load Assembly and Library
Add-Type -AssemblyName PresentationFramework

[xml]$Form = @"
<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"  




    Title="MainWindow" Height="1000" Width="1000">  

     <ScrollViewer VerticalScrollBarVisibility="Auto">  

      <StackPanel VerticalAlignment="Top">  

        $AnotherTest

      <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
    </Grid.RowDefinitions>

    <TextBlock FontWeight="Bold" Margin="10" FontFamily="Arial" FontSize="18" Foreground="Black" HorizontalAlignment="Center" Text="Question Nr:" />
    <TextBlock Grid.Column="1" FontWeight="Bold" Margin="10" FontFamily="Arial" FontSize="18" Foreground="Black" HorizontalAlignment="Center" Text="Asked Question" />
    <TextBlock Grid.Column="2" FontWeight="Bold" Margin="10" FontFamily="Arial" FontSize="18" Foreground="Black" HorizontalAlignment="Center" Text="Expected Answer" />
    <TextBlock Grid.Column="3" FontWeight="Bold" Margin="10" FontFamily="Arial" FontSize="18" Foreground="Black" HorizontalAlignment="Center" Text="Your Answer" />
    <TextBlock Grid.Column="4" FontWeight="Bold" Margin="10" FontFamily="Arial" FontSize="18" Foreground="Black" HorizontalAlignment="Center" Text="Result" />



    <Button Grid.Column="1" Grid.Row="1">Button 5</Button>
    <Button Grid.Column="2" Grid.Row="1">Button 6</Button>
    <Button Grid.Row="2">Button 7</Button>
    <Button Grid.Column="1" Grid.Row="2">Button 8</Button>


</Grid>

</StackPanel>  
</ScrollViewer>  
</Window> 

"@

#Create a form
$XMLReader = (New-Object System.Xml.XmlNodeReader $Form)
$XMLForm = [Windows.Markup.XamlReader]::Load($XMLReader)

#Show XMLform
[void]$XMLForm.ShowDialog()

Проблема, с которой я сейчас борюсь, связана со строкой, содержащей этот код:

$AnotherTest = '<TextBlock FontWeight="Bold" Margin="10" FontFamily="Arial" FontSize="28" Foreground="Blue" HorizontalAlignment="Center" Text="$Test" />  <Separator />'

Я пытался добавить переменную за «Текст», но, пробуя все виды вещей, я не могу получить «Результаты словарного теста» в виде текста.Либо у меня появляются сообщения об ошибках, либо я получаю пустое поле, либо вижу код переменной, а не ожидаемый результат.

Я попробовал несколько идей, таких как

Text="$($Test")
Text=$Test
Text=""$Test""
Text={$Test}

и еще несколько,Ни один из них не дал ожидаемого результата.Пытаясь найти какое-то решение в Интернете, я видел несколько обязательных примеров, но должен признать, что я не до конца понял, как это работает.

Существует ли простой способ решить эту проблему или нет способа обойти привязки иесли да, как бы я это сделал?

Спасибо за любую помощь и предложения

1 Ответ

1 голос
/ 27 сентября 2019
  • "..." цитирование (двойное цитирование) требуется для ссылок на переменные (например, $text) или подвыражений (например, $($text + '!')) встроенный в такую ​​строку должен быть расширен (интерполирован), т. е. заменен на их значение.

    • В отличие от содержимого '...' (одиночногов кавычках) строка интерпретируется дословно - расширения не происходит.
  • Если вам нужно встраивать литерал " символов в"..." строка, вам нужно экранировать их (каждого), что можно сделать одним из двух способов:

    • как `", что предпочтительно, потому что` обычно действует как escape-символ PowerShell;Например:
      • "Nat `"King`" Cole"
    • В качестве альтернативы, только внутри "...", вы можете использовать "".
      • "Nat ""King"" Cole"
  • Вы можете избежать необходимости этого экранирования, если вы используете расширяемый here-string (@"<newline>...<newline>"@), так как вы уже используете для присвоения переменной $Form;обратите внимание, что закрывающий разделитель, "@, должен находиться на отдельной строке и в самом начале 1061 * этой строки, чтобы быть распознанным.

См. about_Quoting_Rules .

Применительно к вашему сценарию:

  • В качестве расширяемой строки с экранированием:
$AnotherTest = "<TextBlock FontWeight=`"Bold`" ... Text=`"$Test`" />  <Separator />"
  • Как здесь-строка , без экранирования:
$AnotherTest = @"
<TextBlock FontWeight="Bold" Margin="10" FontFamily="Arial" FontSize="28" Foreground="Blue" HorizontalAlignment="Center" Text="$Test" />  <Separator />
"@
...