如何解决WPF / PowerShell,从没有标题的数据网格复制单个单元格
在通过PowerShell的WPF DataGrid中,我希望用户能够按以下方式复制单元格:1)如果选择了多个单元格和行,则将其复制到标头。 2)如果仅选择一个单元格,则复制没有标题的单元格内容。在下面显示的示例中,我设置了ClipboardCopyMode =“ IncludeHeader”,它可以复制带有满足上述第一个要求的标头的所选单元格/行。但是,我正在寻找一些想法或快速示例,以满足上面显示的第二个要求,即如果仅选择单个单元格(从上下文菜单或快捷方式),则不带标题就复制内容。我尝试了鼠标事件,但无法正常工作。预先感谢。
[xml]$xaml=@"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Test"
Title="MainWindow" Height="425" Width="550">
<Grid>
<TextBox x:Name="tb_Search" HorizontalAlignment="Left" Height="23" Margin="10,10,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="149"/>
<Button x:Name="bt_Search" Content="Search" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" IsDefault="True" Height="22" Margin="165,0" />
<DataGrid x:Name="dg" Margin="10,45,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinHeight="100" Height="Auto" Width="Auto" ColumnWidth="Auto" AlternationCount="1" IsReadOnly="True" SelectionMode="Extended" SelectionUnit="Cell" Background="White" ClipboardCopyMode="IncludeHeader">
<DataGrid.ContextMenu>
<ContextMenu >
<MenuItem Command="{x:Static ApplicationCommands.Copy}" Header="Copy With Header"/>
<MenuItem Command="{x:Static ApplicationCommands.Save}" Header="Save"/>
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
</Grid>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load($reader)
#Turn XAML into PowerShell objects
$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'x:Name')]]") | ForEach-Object{
Set-Variable -Name ($_.Name) -Value $Window.FindName($_.Name)
}
#sample data
$DataSet = New-Object System.Data.DataSet
$Table = $DataSet.Tables.Add("Table")
$Properties = @("Country","Capital","Population")
$Properties | foreach {
$Column = New-Object System.Data.DataColumn($_)
$Table.Columns.Add($Column)
}
$Null=$Table.Rows.Add("China PR","Beijing","20,693,000")
$Null=$Table.Rows.Add("India","New Delhi","16,787,949")
$Null=$Table.Rows.Add("Japan","Tokyo","13,189,000")
$Null=$Table.Rows.Add("Philippines","Manila","12,877,253")
$Null=$Table.Rows.Add("Russia","Moscow","11,541,000")
$Null=$Table.Rows.Add("Egypt","Cairo","10,230,350")
$Null=$Table.Rows.Add("USA","Washington,D.C","658,893")
$Null=$Table.Rows.Add("China PR",893")
#populate datagrid
$DataView = New-Object System.Data.DataView($Table)
$array = New-Object System.Collections.ArrayList
[void] $array.AddRange($DataView)
$dg.clear()
$dg.ItemsSource = $array
$dg.IsReadOnly = $true
$bt_Search.Add_Click({
$SearchValue = $tb_Search.text
for ($i = 0; $i -lt $dg.Items.Count; $i++)
{
if ($dg.Items[$i].Row[$dg.Columns.DisplayIndex] -eq "$SearchValue")
{
[System.Windows.Forms.MessageBox]::Show("Keyword Found")
$dg.ScrollIntoView($dg.Items[$i]) #scroll to the row that contains the keyword searched
}
}
})
#Display Form
$Window.ShowDialog() | Out-Null
解决方法
您可以在ClipboardCopyMode
命令的CanExcecute方法中动态设置ApplicationCommands.Copy
。这就是您在C#中的操作方式:
private void CommandBinding_CanExecute(object sender,CanExecuteRoutedEventArgs e)
{
DataGrid dataGrid = (DataGrid)sender;
dataGrid.ClipboardCopyMode = dataGrid.SelectedCells.Count == 1 ?
DataGridClipboardCopyMode.ExcludeHeader : DataGridClipboardCopyMode.IncludeHeader;
}
XAML:
<DataGrid ... SelectionMode="Extended" SelectionUnit="Cell" ClipboardCopyMode="IncludeHeader">
<DataGrid.CommandBindings>
<CommandBinding Command="{x:Static ApplicationCommands.Copy}" CanExecute="CommandBinding_CanExecute"/>
</DataGrid.CommandBindings>
</DataGrid>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。