2011-03-21 74 views
3

我们在尝试为WPF中的自定义控件创建事件时遇到问题。我们有这样的代码:WPF - 用户控件内部发生的事件


public static readonly RoutedEvent KeyPressedEvent = 
      EventManager.RegisterRoutedEvent(
       "keyPressed", RoutingStrategy.Bubble, 
        typeof(KeyEventHandler), typeof(Keyboard));

public event KeyEventHandler keyPressed 
    { 
     add { AddHandler(KeyPressedEvent, value); } 
     remove { RemoveHandler(KeyPressedEvent, value); } 
    } 

void btnAlphaClick(object sender, RoutedEventArgs e) 
    { 
     var btn = (Button)sender; 
     Key key = (Key)Enum.Parse(typeof(Key), btn.Content.ToString().ToUpper()); 
     PresentationSource source = null; 
     foreach (PresentationSource s in PresentationSource.CurrentSources) 
     { 
      source = s; 
     } 
     RaiseEvent(new KeyEventArgs(InputManager.Current.PrimaryKeyboardDevice, source,0,key)); 

控制是屏幕键盘上,我们基本上需要传递出的KeyPressedEventArgs到订户对事件的细节是什么键被按下(我们无法在WPF中找到很多帮助我们,只有winforms)。

任何帮助,非常感谢!

+0

也许是正确的事件是PreviewKeyUp和PreviewKeyDown。另外我会使用隧道事件而不是泡沫。我不确定,我会在稍后检查我的假设。 – vorrtex 2011-03-21 17:02:08

+0

你尝试过“KeyGestures”吗? – Pacman 2011-03-22 04:41:43

+0

刚进办公室。但感谢有兴趣的人,我会看看上面提到的那些 – JBeagle 2011-03-22 09:27:12

回答

7

第1步:添加事件处理程序,以确定和取消按钮

private void btnOK_Click(object sender, RoutedEventArgs e) 
{  
} 

private void btnCancel_Click(object sender, RoutedEventArgs e) 
{  
} 

添加了公共财产的UserControl1.xaml.cs文件与主机

public string UserName 
{ 
    get { return txtName.Text; } 
    set { txtName.Text = value; } 
} 
共享文本框的值

声明可以通过Windows窗体订阅的确定和取消按钮的事件。

public event EventHandler OkClick; 
public event EventHandler CancelClick; 

现在将代码添加到事件处理程序中,以便我们也可以将事件引发到主机。

private void btnOK_Click(object sender, RoutedEventArgs e) 
{ 
    if (OkClick != null) 
     OkClick(this, e); 
} 

private void btnCancel_Click(object sender, RoutedEventArgs e) 
{ 
    if (CancelClick != null) 
     CancelClick(this, e); 
} 

第2步:处理WPF控制事件在Windows窗体

添加处理程序,以OKClickCancelClick活动只是在处理程序创建用户控件的实例

_WPFUserControl.OkClick += new EventHandler(OnOkHandler); 
_WPFUserControl.CancelClick += new EventHandler(OnCancelHandler); 

编写代码后方法。在这里,我使用OK按钮处理程序中的UserName属性,以显示如何共享这些值。

protected void OnOkHandler(object sender, EventArgs e) 
{ 
    MessageBox.Show("Hello: " +_WPFUserControl.UserName + " you clicked Ok Button"); 
} 

protected void OnCancelHandler(object sender, EventArgs e) 
{ 
    MessageBox.Show("you clicked Cancel Button"); 
} 

参考: http://a2zdotnet.com/View.aspx?Id=79

+2

不要忘记标记这是一个被接受的答案;如果您能够快速总结具体帮助的内容,那么也要这样做 - 该主机可能并不总是存在,或者它可能会在某个时候更改其所有网址。 – sarnold 2011-03-23 05:42:50