2015-03-06 2 views
0

Я написал следующий сценарий Test.ps1 PowerShell для отображения графического интерфейса WPF:доступ UserControl элементов/свойство из главного окна в сценарии WPF XAML PowerShell

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' 
$MainWindow.Content = $Page1 

$TextBox1 = $MainWindow.FindName('TextBox1') 
# The following line fails because $TextBox1 is null 
$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> 

Проблема, как указано в моем коде PowerShell, заключается в том, что я не могу получить доступ к элементам/свойствам UserControl после добавления UserControl в главное окно. Я знаю, что могу получить к нему доступ с $Page1.FindName('TextBox1'), но есть ли способ сделать это от объекта $MainWindow?

+0

Вы хотите сказать, что вам нужно получить доступ к элементам из объекта $ Page1? Не объект $ MainWindow? –

+0

Я имею в виду, что после добавления объекта '$ Page1' в' $ MainWindow.Content' я должен иметь доступ к TextBox1 из '$ MainWindow', что не соответствует моему текущему коду. – Christophe

ответ

1

Вы должны сделать FindName в Content из $MainWindow

$TextBox1 = $MainWindow.Content.FindName("TextBox1") 
+0

О, я вижу, это работает, но обычно, когда мне нужно получить доступ к элементу окна, '$ MainWindow.FindName (" TextBox1 ")' достаточно, вы думаете, что предыдущий '$ MainWindow.Content = $ Page1' является коренной причиной необходимости использования '$ MainWindow.Content.FindName (" TextBox1 ")'? Если это возможно, есть более чистый способ добавить UserControl в мое окно? – Christophe

+0

$ MainWindow - это 'System.Windows.Controls.ContentControl'. Если вы выполните «FindName», он будет искать только этот элемент управления. $ MainWindow.Content - это другой, другой 'System.Windows.Controls.ContentControl'. Вот почему он не работал. Бит ржавый на WPF, поэтому не знаю никаких более чистых способов сделать это. – Rubanov

+0

Хорошо, спасибо за вашу помощь. – Christophe

Смежные вопросы