WPF列表框复制到剪贴板 [英] WPF listbox copy to clipboard

查看:1742
本文介绍了WPF列表框复制到剪贴板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图复制一个标准的WPF列表框中选择的项目(显示)文本到剪贴板上的Ctrl + C。有没有简单的方法来实现这一目标。如果是的东西,所有的列表框作品诠释,他的应用程式..这将是巨大的。

I am trying to copy a standard WPF listbox selected Item (displayed) text to clipboard on CTRL+C. Is there any simple way to achieve this. If it is something that works for all the listboxes int he app.. that would be great.

先谢谢了。

推荐答案

正如你在WPF是如此,你可以尝试附加的行为

首先,你需要一个像这样的类:

As you're in WPF so you could try the attached behaviours
First you need a class like this:

public static class ListBoxBehaviour
{
    public static readonly DependencyProperty AutoCopyProperty = DependencyProperty.RegisterAttached("AutoCopy",
        typeof(bool), typeof(ListBoxBehaviour), new UIPropertyMetadata(AutoCopyChanged));

    public static bool GetAutoCopy(DependencyObject obj_)
    {
        return (bool) obj_.GetValue(AutoCopyProperty);
    }

    public static void SetAutoCopy(DependencyObject obj_, bool value_)
    {
        obj_.SetValue(AutoCopyProperty, value_);
    }

    private static void AutoCopyChanged(DependencyObject obj_, DependencyPropertyChangedEventArgs e_)
    {
        var listBox = obj_ as ListBox;
        if (listBox != null)
        {
            if ((bool)e_.NewValue)
            {
                ExecutedRoutedEventHandler handler =
                    (sender_, arg_) =>
                    {
                        if (listBox.SelectedItem != null)
                        {
                            //Copy what ever your want here
                            Clipboard.SetDataObject(listBox.SelectedItem.ToString());
                        }
                    };

                var command = new RoutedCommand("Copy", typeof (ListBox));
                command.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Control, "Copy"));
                listBox.CommandBindings.Add(new CommandBinding(command, handler));
            }
        }
    }
}

< BR>
然后你的XAML这样


Then you have the XAML like this

<ListBox sample:ListBoxBehaviour.AutoCopy="True">
  <ListBox.Items>
    <ListBoxItem Content="a"/>
    <ListBoxItem Content="b"/>
  </ListBox.Items>
</ListBox>





更新:对于简单的情况下,您可以访问文本以下方式:


Updates: For the simplest case, you can access the text in the below way:

private static string GetListBoxItemText(ListBox listBox_, object item_)
{
  var listBoxItem = listBox_.ItemContainerGenerator.ContainerFromItem(item_)
                    as ListBoxItem;
  if (listBoxItem != null)
  {
    var textBlock = FindChild<TextBlock>(listBoxItem);
    if (textBlock != null)
    {
      return textBlock.Text;
    }
  }
  return null;
}

GetListBoxItemText(myListbox, myListbox.SelectedItem)
FindChild<T> is a function to find a child of type T of a DependencyObject



但就像ListBoxItem中才能绑定对象,ItemTemplate中可能是不同的,所以你不能在实际项目依赖于它。

But just like the ListBoxItem could be bound to object, the ItemTemplate could be different as well, so you can't rely on it in real projects.

这篇关于WPF列表框复制到剪贴板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆