我正在尝试为自己创建一个RDP管理器。由于RDP管理器在使用期间动态添加和关闭选项卡,因此我需要在WPF中正常工作。
如果我在按钮上添加一个函数(方法),在tabitem模板中,它在visual studio中工作得很好。当我将XAML复制到我的PowerShell脚本时,我无法在按下该按钮时运行某个功能。由于按钮位于模板内部,因此我无法访问PowerShell脚本中的按钮控件来创建add_click({ #somecode })
。
这是我的WPF tabcontrol:
<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中完成,我就可以了。
答案 0 :(得分:0)
感谢PowerShell facebook小组内部人员的帮助,我有以下解决方案。这将为tabcontrol创建一个处理程序,它会检查标题内是否按下了按钮。如果是,请继续关闭标签页。
[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)