PowerShell WPF 动态呈现关闭选项卡按钮
PowerShell WPF dynamically render close tabs button
我正在尝试为自己创建一个 RDP 管理器。由于 RDP 管理器在使用期间动态添加和关闭选项卡,我需要它在 WPF 中正常工作。
如果我在 tabitem 模板中向按钮添加一个函数(方法),它在 visual studio 中工作得很好。当我将 XAML 复制到我的 PowerShell 脚本时,按下该按钮时我无法 运行 函数。由于按钮在模板内,我无法访问 PowerShell 脚本内的按钮控件来创建 add_click({ #somecode })
.
这是我的 WPF 选项卡控件:
<TabControl Name="MainTabControlRDPPages" ItemsSource="{Binding Tabs}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate DataType="local:TabViewModel">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding}"/>
<Button Grid.Column="1" x:Name="button_close" Click="RunPowershellTest">
<Button.Template>
<ControlTemplate TargetType="Button">
<Path Data="M0,0 L8,8 M8,0 L0,8" StrokeThickness="3" VerticalAlignment="Center" Margin="5,4,0,2">
<Path.Style>
<Style TargetType="{x:Type Path}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Stroke" Value="LightGray" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Stroke" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
</ControlTemplate>
</Button.Template>
</Button>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.ItemContainerStyle>
<TabItem Header="No Session" />
</TabControl>
我在 PowerShell 中使用这段代码来读取所有控件并为它们命名。
$reader =(New-Object System.Xml.XmlNodeReader $xaml)
$Window = [Windows.Markup.XamlReader]::Load( $reader )
$xaml.SelectNodes("//*[@Name]") | ForEach-Object { Set-Variable -Name
($_.Name) -Value $window.FindName($_.Name) -Scope Script }
如何确保可以为 button_close
按钮创建点击事件?如果有一个选项可以在 Powershell 执行期间手动添加 WPF 格式的 tabitem 而无需指定模板,我也可以接受。
更新
按钮只需要关闭标签页即可。如果这可以在 XAML 内完成,我同意。
感谢 PowerShell facebook 组内某人的帮助,我得到了以下解决方案。这为 tabcontrol 创建了一个处理程序,它检查是否在 header 中按下了按钮。如果是,继续关闭标签页。
[System.Windows.RoutedEventHandler]$EventontabControl = {
$script:headerName = $_.OriginalSource
Write-Host $headername
$script:MainTabControlRDPPageToClose = $_.Source
$MainTabControlRDPPages.Items.Remove($MainTabControlRDPPageToClose)
}
$MainTabControlRDPPages.AddHandler([System.Windows.Controls.Button]::ClickEvent, $EventontabControl)
我正在尝试为自己创建一个 RDP 管理器。由于 RDP 管理器在使用期间动态添加和关闭选项卡,我需要它在 WPF 中正常工作。
如果我在 tabitem 模板中向按钮添加一个函数(方法),它在 visual studio 中工作得很好。当我将 XAML 复制到我的 PowerShell 脚本时,按下该按钮时我无法 运行 函数。由于按钮在模板内,我无法访问 PowerShell 脚本内的按钮控件来创建 add_click({ #somecode })
.
这是我的 WPF 选项卡控件:
<TabControl Name="MainTabControlRDPPages" ItemsSource="{Binding Tabs}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate DataType="local:TabViewModel">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding}"/>
<Button Grid.Column="1" x:Name="button_close" Click="RunPowershellTest">
<Button.Template>
<ControlTemplate TargetType="Button">
<Path Data="M0,0 L8,8 M8,0 L0,8" StrokeThickness="3" VerticalAlignment="Center" Margin="5,4,0,2">
<Path.Style>
<Style TargetType="{x:Type Path}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Stroke" Value="LightGray" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Stroke" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
</ControlTemplate>
</Button.Template>
</Button>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.ItemContainerStyle>
<TabItem Header="No Session" />
</TabControl>
我在 PowerShell 中使用这段代码来读取所有控件并为它们命名。
$reader =(New-Object System.Xml.XmlNodeReader $xaml)
$Window = [Windows.Markup.XamlReader]::Load( $reader )
$xaml.SelectNodes("//*[@Name]") | ForEach-Object { Set-Variable -Name
($_.Name) -Value $window.FindName($_.Name) -Scope Script }
如何确保可以为 button_close
按钮创建点击事件?如果有一个选项可以在 Powershell 执行期间手动添加 WPF 格式的 tabitem 而无需指定模板,我也可以接受。
更新
按钮只需要关闭标签页即可。如果这可以在 XAML 内完成,我同意。
感谢 PowerShell facebook 组内某人的帮助,我得到了以下解决方案。这为 tabcontrol 创建了一个处理程序,它检查是否在 header 中按下了按钮。如果是,继续关闭标签页。
[System.Windows.RoutedEventHandler]$EventontabControl = {
$script:headerName = $_.OriginalSource
Write-Host $headername
$script:MainTabControlRDPPageToClose = $_.Source
$MainTabControlRDPPages.Items.Remove($MainTabControlRDPPageToClose)
}
$MainTabControlRDPPages.AddHandler([System.Windows.Controls.Button]::ClickEvent, $EventontabControl)