2011-03-16 87 views
0

我有一個自定義類(ItemsContainer),其中包含幾個按鈕& UserControls。WPF MouseWheel和KeyDown沒有輸入焦點沒有調用?

我正在實現一個使用鼠標&輸入的導航系統,用戶可以'平移'使用右鍵單擊...但除非用戶點擊某些交互式(按鈕等),我的方法爲'mousewheel'和'keydown'不叫。

到目前爲止我發現的最好的文章說我需要'鉤'自己在每一個控制!解析每一個可視化節點並在所有地方添加EventHandler聽起來很愚蠢......必須有一個更簡單的方法。

有嗎?

回答

1

這個問題中嵌入了一些需要解決的問題。

首先是RoutedEvent會向外傳播並向上傳播視覺樹。因此,如果你已經嵌入控件中的控件像這樣...

<Grid Name="MyGrid"> 
     <StackPanel> 
      <Button>Button 1</Button> 
      <Button>Button 2</Button> 
      <Button> 
       <TextBlock>Button 3</TextBlock> 
      </Button> 
     </StackPanel> 
    </Grid> 

...附加一個事件來處理MyGridKeyDown行爲;將從其子女內接收任何KeyDownRoutedEvent

有一個警告,如果該事件被標記爲由視覺樹內的控件處理,這將是Button控件和MouseLeftButtonDown RoutedEvent的情況;那麼你需要調整你的註冊方式。這很簡單,可以這樣做;其中true表明即使另一個處理程序標記事件處理,也希望通知您。

public Window1() 
    { 
     InitializeComponent(); 

     MyGrid.AddHandler(UIElement.MouseLeftButtonDownEvent, new RoutedEventHandler(MouseLeftButtonDown), true); 
    } 

    private void MouseLeftButtonDown(object sender, RoutedEventArgs e) 
    { 
     Console.WriteLine("MouseLeftButtonDown Fired"); 
    } 

如果你用調試器來逐步通過你會看到的RoutedEvent的,當你點擊文本按鈕3源確實是TextBlock

這將解決您需要掛鉤到不同的控件;因爲您可以利用變化的RoutedEvents

焦點仍然必須存在於應用程序的某個地方,可以通過父控制輕鬆設置並調用Focus