我编写了以下Test.ps1
PowerShell脚本来显示WPF GUI:
function LoadXamlFile( $path )
{
[System.Xml.XmlDocument]$xml = Get-Content -Path $path
$xmlReader = New-Object -TypeName System.Xml.XmlNodeReader -ArgumentList $xml
$xaml = [System.Windows.Markup.XamlReader]::Load( $xmlReader )
return $xaml
}
# Main Window
$MainWindow = LoadXamlFile 'MainWindow.xaml'
# Page 1
$Page1 = LoadXamlFile 'Page1.xaml'
# Is there a cleaner way than the following line to add a UserControl object to the main window?
$MainWindow.Content = $Page1
$TextBox1 = $MainWindow.Content.FindName('TextBox1')
$TextBox1.Text = 'test'
$MainWindow.ShowDialog()
此脚本需要以下两个XAML文件:
MainWindow.xaml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="MainWindow"
Title="WPF Test" Height="200" Width="400">
</Window>
Page1.xaml
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Page1">
<Grid>
<TextBox x:Name="TextBox1" HorizontalAlignment="Center" Height="23" Margin="0,-40,0,0" TextWrapping="Wrap" VerticalAlignment="Center" Width="120"/>
<Button x:Name="Button1" Content="Next" HorizontalAlignment="Center" Margin="0,40,0,0" VerticalAlignment="Center" Width="76"/>
</Grid>
</UserControl>
有没有办法将UserControl添加到我的主窗口,这样我就能找到$TextBox1 = $MainWindow.FindName('TextBox1')
而不是$TextBox1 = $MainWindow.Content.FindName('TextBox1')
的元素?
$MainWindow.Content = $Page1
是将UserControl添加到主窗口的正确方法吗?
答案 0 :(得分:1)
如果您愿意,可以执行此操作:$MainWindow.AddChild($Page1)
。
您可以通过索引访问文本框 - 但这不是非常清晰的imo:
# $TextBox1 = $MainWindow.Content.FindName('TextBox1')
# $TextBox1.Text = 'test'
$Page1.Content.Children[0].Text = 'test'
我不确定您期望的代码会有什么样的改进。这似乎没问题,除了你使用PowerShell操作GUI这一事实 - 这几乎总是错误的做事方式。
答案 1 :(得分:1)
您无法直接执行此操作,因为UserControl拥有自己的naming scope。如果你将usercontrol添加到mainwindow两次,哪个元素应该FindName方法返回?
但是,您可以编写自己的方法,遍历可视树。 这是一个:http://www.codeproject.com/Articles/63157/LINQ-to-Visual-
public static IEnumerable<UIElement> Descendants(this UIElement element)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
{
var child = VisualTreeHelper.GetChild(element, i) as UIElement;
if (child == null) continue;
yield return child;
foreach (var childOfChild in Descendants(child))
{
yield return childOfChild;
}
}
}