Обычно XAML я использую для столбца сетки данных с кнопкой-то вроде этого:Добавить событие Click WPF DataGrid Button Колонка в PowerShell
<DataGridTemplateColumn Header="ButtonColumn">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Click="Click_Handler">Do Something</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
При использовании XAML в Powershell однако Click = не может быть используются, насколько я знаю, как он бросает ошибку:
"Failed to create a 'Click' from the text 'ClickEvent'.
Как я могу получить ссылку на объект кнопки во время выполнения, чтобы добавить обработчик событий нажмите? Или есть способ создать функцию в Powershell, которая может быть вызвана именем, указанным в обработчике событий XAML.
Предоставление объекту имя и с помощью
$window.FindName("<button name>")
Не работает
Упрощенный пример графического интерфейса может быть собран:
[xml]$xaml = @'
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Window" Title="Demo" WindowStartupLocation = "CenterScreen"
SizeToContent="WidthAndHeight"
ShowInTaskbar = "True">
<StackPanel Orientation="Vertical" Name="msiStackPanel">
<TextBlock Margin="20,20,20,20" HorizontalAlignment="Center" FontSize="14" FontWeight="Bold">List of Stuff</TextBlock>
<DataGrid Name="myGrid" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTemplateColumn Header="Launch">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Name="x:launchButton">Launch</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<Button Margin="20,20,20,20">Completed All Tests</Button>
</StackPanel>
</Window>
'@
# Set PowerShell variable for each named object in GUI
Function Set-WpfVariables
{
param($children)
ForEach ($child in $children.Children)
{
Set-WpfVariables -Children $child
if (![String]::IsNullOrEmpty($child.Name))
{
Write-Host "Set variable $($child.Name)"
Set-Variable -Name $child.Name -Value $child -Scope global
}
}
}
# Build Window
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load($reader)
$controls = [System.Windows.LogicalTreeHelper]::GetChildren($window)
Set-WpfVariables -Children $controls
$table = New-Object System.Data.DataTable
$table.Columns.Add("Name")
$table.Rows.Add("Row 1")
$table.Rows.Add("Row 2")
$myGrid.DataContext = $table.DefaultView
$window.ShowDialog()
Да, это будет легко работать на C#, но в PowerShell. Я не уверен, как это будет достигнуто. Добавлен полный пример. –