WPF中FrameworkElement的KeyDown事件无法触发

Kellen_He 2013-08-13 05:41:42
定义了一个类MyFrameworkElement继承FrameworkElement,
然后用一个Window的this.AddChild(MyFrameworkElement)添加为子元素。
KeyDown的时候可以触发Window的KeyDown事件, 无法触发MyFrameworkElement的KeyDown事件。
请问为什么?
...全文
726 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kellen_He 2013-08-23
  • 打赏
  • 举报
回复
子控件没有获取焦点。 要把属性 Focusable = true; 然后用 FocusManager.SetFocusedElement 设置焦点。
Kellen_He 2013-08-15
  • 打赏
  • 举报
回复
KeyDown事件还是触发不了
qldsrx 2013-08-14
  • 打赏
  • 举报
回复
引用 4 楼 langyuewu 的回复:
因为事件被截获了,加上这段 UIElement.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler((o, e) =>{});
你那个是鼠标事件,他的是键盘事件,而且这里没有拦截的说法,至少楼主没有提到有拦截代码。 键盘事件的触发,需要那个控件捕获到了焦点才行,如果你定义的控件没有焦点,自然是不会引发键盘事件了。
流木晴天 2013-08-14
  • 打赏
  • 举报
回复
因为事件被截获了,加上这段 UIElement.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler((o, e) =>{});
Kellen_He 2013-08-14
  • 打赏
  • 举报
回复
引用 18 楼 qldsrx 的回复:
[quote=引用 8 楼 Kellen_He 的回复:] 发现问题了, MouseDown也触发不了,但是我在MyFrameworkElement里面画条线,只有点到线上才能触发, 点到空白处无法触发。为什么? 我想点到控件上就触发。
鼠标事件我最近才研究过,键盘事件还没,太忙,没时间帮你测。 对于鼠标事件,它是由你点击的那个Element,向上冒泡的。对于容器性质的Element,内部如果不填充满,未填充部分是不会引发任何的鼠标事件的,不过可以设置背景色,例如白色后,这样容器内部任何地方都可以响应鼠标事件了,有点感觉像是BUG[/quote] 嗯, 如果填满背景色就可以触发。
Kellen_He 2013-08-14
  • 打赏
  • 举报
回复
再次求真相。
qldsrx 2013-08-14
  • 打赏
  • 举报
回复
引用 8 楼 Kellen_He 的回复:
发现问题了, MouseDown也触发不了,但是我在MyFrameworkElement里面画条线,只有点到线上才能触发, 点到空白处无法触发。为什么? 我想点到控件上就触发。
鼠标事件我最近才研究过,键盘事件还没,太忙,没时间帮你测。 对于鼠标事件,它是由你点击的那个Element,向上冒泡的。对于容器性质的Element,内部如果不填充满,未填充部分是不会引发任何的鼠标事件的,不过可以设置背景色,例如白色后,这样容器内部任何地方都可以响应鼠标事件了,有点感觉像是BUG
Kellen_He 2013-08-14
  • 打赏
  • 举报
回复
引用 16 楼 langyuewu 的回复:
你有应用模板吗?为什么不继承UerControl?
没有,我对WPF还不熟悉, 继承UserControl也触发不了。奇怪了
流木晴天 2013-08-14
  • 打赏
  • 举报
回复
你有应用模板吗?为什么不继承UerControl?
Kellen_He 2013-08-14
  • 打赏
  • 举报
回复
引用 14 楼 syty_msyl 的回复:
你触发不了的控件是哪个?
先谢谢。 1. 定义了一个类,继承FrameworkElement。

            public class KDrawingBoard : FrameworkElement, IDisposable
2. 然后在MainWindow的Load事件中写入

            kDrawingBoard = new KDrawingBoard();
            kDrawingBoard.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
            kDrawingBoard.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
            this.AddChild(kDrawingBoard);
触发不了KDrawingBoard 的鼠标,键盘事件。
syty_msyl 2013-08-14
  • 打赏
  • 举报
回复
你触发不了的控件是哪个?
syty_msyl 2013-08-14
  • 打赏
  • 举报
回复
在想想啊 回答你上一个问题 不知道你想实现什么,如果在xaml中写的话,直接把宽和高设置成Auto就会自动和上层的控件一样大小,如果在代码里面写的话,需要做绑定操作

        /// <summary>
        /// 事件绑定
        /// </summary>
        /// <param name="eleSrc">绑定源</param>
        /// <param name="eleDes">被绑定目标</param>
        private void Bind(FrameworkElement eleSrc, FrameworkElement eleDes)
        {
            try
            {
                Binding oBindWidth = new Binding();
                oBindWidth.Source = eleSrc;
                oBindWidth.Path = new PropertyPath(FrameworkElement.WidthProperty);
                oBindWidth.Mode = BindingMode.TwoWay;
                eleDes.SetBinding(FrameworkElement.WidthProperty, oBindWidth);

                Binding oBindHgiht = new Binding();
                oBindHgiht.Source = eleSrc;
                oBindHgiht.Path = new PropertyPath(FrameworkElement.HeightProperty);
                oBindHgiht.Mode = BindingMode.TwoWay;
                eleDes.SetBinding(FrameworkElement.HeightProperty, oBindHgiht);
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }
Kellen_He 2013-08-14
  • 打赏
  • 举报
回复
引用 11 楼 syty_msyl 的回复:
最笨的方法,把主界面的OnPreviewKeyDown方法创建出来,放在那不用,然后在控件中创建PrivateKeyDown应该就可以用了
触发不了。。。。
syty_msyl 2013-08-14
  • 打赏
  • 举报
回复
最笨的方法,把主界面的OnPreviewKeyDown方法创建出来,放在那不用,然后在控件中创建PrivateKeyDown应该就可以用了
Kellen_He 2013-08-14
  • 打赏
  • 举报
回复
引用 9 楼 syty_msyl 的回复:
被主界面的路由事件拦截了,使用OnPreviewKeyDown这个事件,可以触发
也触发不了。。。 请问下WPF中没有Dock属性, 如何让子控件撑满父控件,并随着父控件的大小改变?
syty_msyl 2013-08-14
  • 打赏
  • 举报
回复
被主界面的路由事件拦截了,使用OnPreviewKeyDown这个事件,可以触发
Kellen_He 2013-08-14
  • 打赏
  • 举报
回复
发现问题了, MouseDown也触发不了,但是我在MyFrameworkElement里面画条线,只有点到线上才能触发, 点到空白处无法触发。为什么? 我想点到控件上就触发。
Kellen_He 2013-08-14
  • 打赏
  • 举报
回复
引用 4 楼 langyuewu 的回复:
因为事件被截获了,加上这段 UIElement.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler((o, e) =>{});
这个加在哪里? 鼠标事件也触发不了,能触发OnRender, SizeChange这一类的。
Kellen_He 2013-08-14
  • 打赏
  • 举报
回复
引用 5 楼 qldsrx 的回复:
[quote=引用 4 楼 langyuewu 的回复:] 因为事件被截获了,加上这段 UIElement.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler((o, e) =>{});
你那个是鼠标事件,他的是键盘事件,而且这里没有拦截的说法,至少楼主没有提到有拦截代码。 键盘事件的触发,需要那个控件捕获到了焦点才行,如果你定义的控件没有焦点,自然是不会引发键盘事件了。[/quote] 焦点应该是有的, 现在的情况就相当于Winform中Form里面加一个用户控件this.Controls.Add(UserControl), KeyDown能同时触发Form的和UserControl, 但是在WPF中只能触发父的,不能触发子的。
Kellen_He 2013-08-13
  • 打赏
  • 举报
回复
求真相。。。。
加载更多回复(1)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧