3

我有一些要导入 PowerShell 脚本的 XAML。它包含一个DataGrid显示 PowerShell cmdlet 的结果。我使用DataGridTemplateColumn. 现在,我想为每个按钮添加一个事件处理程序。我可以在代码中做到这一点:

$adUsersList_Results = $activeDirectory_Users_ListControl.FindName('ResultsDataGrid')
$dataTemplate = New-Object 'Windows.DataTemplate'
$buttonElement = New-Object 'Windows.FrameworkElementFactory' ([Windows.Controls.Button])
$buttonElement.SetValue([Windows.Controls.Button]::ContentProperty, "Edit")
$buttonElement.AddHandler([Windows.Controls.Button]::ClickEvent, [Windows.RoutedEventHandler]{
    PARAM (
        [Object]$sender,
        [Windows.RoutedEventArgs]$e
    )
    Write-Host "Clickety-click!"
    Write-Host $sender.DataContext
})
$dataTemplate.VisualTree = $buttonElement
$dataGridTemplateColumn = New-Object 'Windows.Controls.DataGridTemplateColumn'
$dataGridTemplateColumn.Header = 'Poo'
$dataGridTemplateColumn.CellTemplate = $dataTemplate
$adUsersList_Results.Columns.Add($dataGridTemplateColumn)

但这有点笨拙。XAML 如下所示:

<DataGrid Grid.Row="1"
          x:Name="ResultsDataGrid"
          IsReadOnly="True"
          HorizontalAlignment="Stretch"
          Margin="3"
          VerticalAlignment="Stretch">
  <DataGrid.Columns>
    <DataGridTemplateColumn>
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <Button Content="Edit" Width="60" x:Name="ADUserListButton"/>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>

我试过使用 FindName('ADUserListButton') 但它不起作用。有没有办法在 XAML 中保留所有视觉内容并在 PowerShell 中执行事件处理程序?

旁白:我知道 Show-UI。在决定哪个最适合我们之前,我实际上在 Show-UI 和 PowerShell & XAML 中做同样的事情。

我也知道您可以在网格中进行编辑,但我认为这对于此类数据来说并不是一个很好的用户体验。

4

4 回答 4

0

我没有用 powershell 做到这一点,但如果它在用户控件的 .cs 代码隐藏文件中,你可以尝试 GetTemplateChild("your control name")。

于 2014-06-11T20:06:04.533 回答
0

我不太确定,但可能是因为您列出的 XAML 按钮没有与它的处理程序连接?IE

<Button Content="Edit" Width="60" x:Name="ADUserListButton" Click="ADUserListButton_Click"/>
于 2014-06-11T19:26:44.113 回答
0

下面是使用 Powershell 在数据网格中调用按钮的示例,希望对您有所帮助。

Add-Type -AssemblyName PresentationFramework

Function Check-Event($ev,$co,$da){
$comp=$co.trim()
$re = Get-EventLog Application -ComputerName "$comp" -InstanceId $ev -After $da
$res.Text += "There are "+$re.count+" events pf EventID $ev on Computer $Comp after the time $da ch"
}

[Xml]$Form = @"
  <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid HorizontalAlignment="Left" Height="151" Margin="112,35,0,0" VerticalAlignment="Top" Width="279"/>
        <Button Name="ADUserListButton" Content="Edit" HorizontalAlignment="Left" Margin="140,85,0,0" VerticalAlignment="Top" Width="75"/>
        <TextBox Name="Result" HorizontalAlignment="Left" Height="23" Margin="140,124,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Text="Hello World"/>
    </Grid>
</Window>

"@

$NR=(New-Object System.Xml.XmlNodeReader $Form)
$Win=[Windows.Markup.XamlReader]::Load( $NR )

$Start = $Win.FindName("ADUserListButton")
$res = $Win.FindName("Result")

$Start.Add_Click({
$event=$res.text
If($event -eq "") {
[System.Windows.MessageBox]::Show("Please make sure all values are entered", "Missing Values")} 
Else{Get-WMIObject -class Win32_ComputerSystem | select username -OutVariable a
$name=$a.username
[System.Windows.MessageBox]::Show("User name is $name", "Hello")
}
})
于 2017-11-03T18:41:04.700 回答
0

我对列出大量数据的网格单击所做的事情,而不是为每个单元格创建代码,您可以在数据网格上创建一个单击处理程序,该处理程序获取选定的行或单元格并对其进行处理。

$adUsersList_Results = $activeDirectory_Users_ListControl.FindName('ResultsDataGrid')
$adUsersList.Add_Click({
  $sender = $args[0]
  $e      = $args[1]
  $prop = $sender.SelectedItem.<#[Some property of the row]#>
  #do something with $prop....
})

不知道这是否是您正在寻找的东西,我知道这有点晚了,但它可能会帮助其他人......

于 2018-04-09T21:45:15.847 回答