在WPF C#中复制一个ListView的项目到剪贴板。

问题描述 投票:7回答:3

如何将WPF的ListView中绑定db字段的选中项复制到剪贴板?

谢谢你Cristian

c# wpf listview clipboard
3个回答
6
投票

由于你想要的是显示的内容,而不是你的类的属性上的数据,你需要直接从控件中抓取数据。

        var sb = new StringBuilder();
        foreach(var item in this.listview1.SelectedItems)
        {
            var lvi = this.listview1.ItemContainerGenerator.ContainerFromItem(item) as ListViewItem;
            var cell = this.GetVisualChild<ContentPresenter>(lvi);
            var txt = cell.ContentTemplate.FindName("txtCodCli", cell) as TextBlock;
            sb.Append(txt.Text);
            //TODO: grab the other column's templated controls here & append text
        }
        System.Windows.Clipboard.SetData(DataFormats.Text, sb.ToString());

这假定在你的XAML中你已经有了

<TextBlock x:Name="txtCodCli" TextAlignment="Left" Text="{Binding Path=VFT_CLI_CODICE}" />

"其中GetVisualChild T是

    public T GetVisualChild<T>(Visual parent) where T : Visual
    {
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
                child = GetVisualChild<T>(v);
            }
            if (child != null)
            {
                break;
            }
        }
        return child;
    }

5
投票

我认为你必须监控SelectionChanged事件,然后将项目格式化为特定的文本格式,然后利用Clipboard.SetText方法将项目设置到剪贴板中。

http:/msdn.microsoft.comen-uslibrarysystem.windows.clipboard.aspx。

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
        foreach (var item in e.AddedItems.OfType<ListViewItem>())
        {
                Clipboard.SetText(item.ToString());
        }
}

0
投票

我是这样解决的。我加入了 Ctrl + C 事件监听器,然后添加逻辑复制到剪贴板。

XAML

<Window 
    ....
        Loaded="Window_Loaded"
        ...>

在编码

private void WindowKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.C && Keyboard.Modifiers == ModifierKeys.Control)
            {
                var sb = new StringBuilder();
                var selectedItems = LVLog.SelectedItems;

                foreach(var item in selectedItems)
                {
                    sb.Append($"{item.ToString()}\n");
                }

                Clipboard.SetDataObject(sb.ToString());
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.