Xaml 文本块中的变量

Xaml Variable in a Textblock

学习PowerShell,有人建议我用Xaml解决一个问题。完全不知道 Xaml,我能够按照我期望的方式为我的私人项目构建一个 window。

使用 Xaml 和下面的代码,我能够生成一个 Window 并在其中放置一个 table。这个想法是为了以后,一个循环将构建 Table 到目前为止,这也是 运行.

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" 后面添加一个变量,但尝试了各种方法,我无法接收 "Vocabulary Test Results" 作为文本。我收到错误消息或以空白字段结束,或者看到可变代码而不是预期结果。

我尝试了几个想法,比如

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

还有一些。其中 None 达到了预期的结果 return。 试图在网上找到一些解决方案,我确实看到了一些绑定示例,但必须承认,我并不完全理解它是如何工作的。

有没有一种简单的方法可以解决这个问题,或者没有解决绑定的方法,如果有,我该怎么做?

感谢您的帮助和建议

  • "..." 需要引号(双引号)以便 变量引用 (例如 $text)或 subexpressions (e.g., $($text + '!')) 嵌入到这样的字符串中 expanded (interpolated),即用它们的值替换。

    • 相比之下,'...'(单引号)字符串的内容被逐字解释 - 没有展开。
  • 如果你需要在 "..." 字符串中 嵌入 文字 " 个字符,你需要 转义 个(每个),可以通过以下两种方式之一完成:

    • As `",这是可取的,因为`通常充当PowerShell的转义字符;例如。:
      • "Nat `"King`" Cole"
    • 或者,仅在 "..." 内,您可以使用 ""
      • "Nat ""King"" Cole"
  • 如果您使用可扩展的 here-string (@"<newline>...<newline>"@),因为您已经在使用分配给 $Form 变量;请注意,结束分隔符 "@ 必须在其自己的行上,并且在该行的 最开始 处才能被识别。

参见 about_Quoting_Rules

适用于您的场景:

  • 作为可扩展字符串,转义:
$AnotherTest = "<TextBlock FontWeight=`"Bold`" ... Text=`"$Test`" />  <Separator />"
  • 作为可扩展的 here-string,无需转义:
$AnotherTest = @"
<TextBlock FontWeight="Bold" Margin="10" FontFamily="Arial" FontSize="28" Foreground="Blue" HorizontalAlignment="Center" Text="$Test" />  <Separator />
"@