C# winform 控件拖动问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# winform 控件拖动问题相关的知识,希望对你有一定的参考价值。

我想模拟一个简单的操作系统桌面,就是在一个全屏的窗体上实现自定义图标控件的拖动效果

我自定义的图标控件用的是透明背景加的图片显示,可以用图标拖动

当全屏窗体上没有背景图片事拖动很正常
可是窗体上加个背景图片后拖动时仿佛重绘太慢似的总是有闪动

请问怎么解决?

各位高手请指教!!!

自己定义图标控件的拖动时,画图的效率很成问题。
可以有一个简单的方法来实现在背景图片上进行图标拖动的效果,那就是使用ListView控件。
先添加一个ImageList控件,把它的Images属性设成几个图标。
然后添加一个ListView控件,把它的BackgroundImage属性设成背景图片;把LargeImageList设成刚才添加的ImageList控件;把View属性设成LargeIcon;
把AllowDrop设成True;把AutoArrange设成False;然后在它的Items属性中添加几项,把各项的Text值和ImageIndex值(小于ImageList中的图片数)设成不同的值。这样就有点象电脑桌面了。
最后添加拖放事件处理程序就行了:
ItemDrag事件
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)

DoDragDrop(e.Item, DragDropEffects.Move);// 开始拖放


DragEnter事件
private void listView1_DragEnter(object sender, DragEventArgs e)

e.Effect = e.AllowedEffect;// 允许在ListView上拖放


DragDrop事件
private void listView1_DragDrop(object sender, DragEventArgs e)

// 取得被拖放的项
ListViewItem draggedItem =
(ListViewItem)e.Data.GetData(typeof(ListViewItem));

draggedItem.Position = listView1.PointToClient(new Point(e.X, e.Y)); // 把它放在鼠标放开时的位置
参考技术A 如果认为是重绘太慢,那么建议自己使用一个线程去重绘。
不过这个闪动好像是通病~ MSDN提供有解决方法,见下:

楼上有人说Form 的 DoubleBuffered 属性改为 True
设置成双缓存,我试过,貌似还是闪动!不知道是不是机子问题!嘿嘿~

MSDN上说:
对于大多数应用程序,.NET Framework 提供的默认双缓冲将提供最佳效果。默认情况下,标准 Windows 窗体控件是双缓冲的。可以通过两种方法对窗体和所创作的控件启用默认双缓冲。一种方法是将 DoubleBuffered 属性设置为 true,另一种方法是通过调用 SetStyle 方法将 OptimizedDoubleBuffer 标志设置为 true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现。建议仅对已为其编写所有呈现代码的自定义控件调用 SetStyle 方法。

对于更多的高级双缓冲情形(如动画或高级内存管理),可以实现自己的双缓冲逻辑。

建议学习这个要多看MSDN

参考资料:MSDN

本回答被提问者采纳
参考技术B 一个非常简单的解决方法,将 Form 的 DoubleBuffered 属性改为 True 应该就好了 参考技术C 说明你实现的控件有些问题 如果窗体有背景的时候 他会先重绘背景 然后在上面绘制控件 如果你拖动频繁的话 那么绘制也很频繁 尤其是你说的是全屏绘制 你要知道图形操作是非常昂贵的

我建议你不要操作控件拖动 而是做一个里面可以包含很多可以拖动项的控件 并且自己处理绘制方法(而不是响应绘制事件)

c# 用户自定义控件的问题 winform

环境 vs2008
新建了一个用户控件 在里面放了个datagridview
然后将这个用户控件放到窗体中没有了datasource这个属性
翻了下 datasource这个属性是来自datagridview
用户控件就没有继承到这个属性 要怎么弄下?请教

参考技术A 你使用用户控件肯定要写自定义属性和自定义事件啦!
加上
private datatable dt;
public datatable gvDataSource

getreturn dt;
setdt=value;

然后把在自定义控件绑定gridview的datasouce处写
gridview.datasource=dt;
gridview.databind();

在使用到该控件的页面中你就可以通过 用户控件名.gvDataSource来给gridview设定数据源了。

至于自定义事件自己研究一下把。
参考技术B 自定义控件里定义一个public
string
btl
在自定义控件的按钮事件里为这个字符串赋上输入框的值
自定义控件对象不就能获取到值了么,
你可以先给btl
一个默认值,然后在波特率下拉列表的下拉事件中重新赋值
参考技术C 继承?
开什么玩笑?

如果你的用户控件是继承于datagridview的,没有问题,会有的
但是你是放到那上的,是不会有的,除非你自己写一个属性,来给你用户控件里的dgv的datasource

感觉你还没有明白什么是继承!
参考技术D 不需要楼上的那么麻烦.
public DataTable gvDataSource

getreturn (DataTable)this.dataGridView1.DataSource;
setthis.dataGridView1.DataSource = value;


使用方法同上所述.本回答被提问者采纳
第5个回答  2009-01-21 写一个对应的 个体get,set成了!
楼上正解

以上是关于C# winform 控件拖动问题的主要内容,如果未能解决你的问题,请参考以下文章

通过C# WinForm控件创建的WPF WIndow窗口控件无法输入的问题

C# VS2010 进行WinForm程序开发,在设计时期,控件无法用鼠标拖动,只能用键盘调整位置。

C#怎么才能实现拖动控件时窗体也跟着移动

C# WinForm的SplitContainer控件固定Panel大小

C#,winform程序中datagridview控件使用多层表头,由于表头项太多,拖动滚动条的时候一直闪,请教高手

winform 控件过多,结果滚动条拖动速度变慢,请问怎么解决?