2011-03-21 73 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