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
变量;请注意,结束分隔符 "@
必须在其自己的行上,并且在该行的 最开始 处才能被识别。
适用于您的场景:
- 作为可扩展字符串,转义:
$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 />
"@
学习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"
- As
如果您使用可扩展的 here-string (
@"<newline>...<newline>"@
),因为您已经在使用分配给$Form
变量;请注意,结束分隔符"@
必须在其自己的行上,并且在该行的 最开始 处才能被识别。
适用于您的场景:
- 作为可扩展字符串,转义:
$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 />
"@