将UserControl添加到WPF XAML PowerShell脚本中的窗口的最佳实践

时间:2015-03-09 09:59:27

标签: wpf xaml powershell powershell-v4.0

我编写了以下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添加到主窗口的正确方法吗?

2 个答案:

答案 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;
            }
        }
    }