2009-02-28 9 views
0

SilverlightアプリケーションでUserControl(ページ)のKeyDownイベントを処理しようとしていますが、Silverlightのユーザー入力機能の一部に奇妙な動作があるようです。どんな状況下でもイベントは起こっていません。私もUserControl内の各コンテナコントロールにイベントハンドラを接続しようとしましたが、まだ運がありません。確かに、Silverlightのユーザー入力「イベントルーティング」システムは非常に斬新で、私にとっては奇妙なように思えるので、進んでいく方法についてはまったくわかりませんが、おそらく私の誤解です。Silverlightページで入力イベントがキャッチされない

次のコードは、私がテストしている特定のページのテンプレートです。 WPFでは

<UserControl x:Class="MyNamespace.CreditsPage" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      KeyDown="UserControl_KeyDown"> 
    <Grid x:Name="LayoutRoot"> 
     <Border> 
      <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Vertical"> 
       <TextBlock TextAlignment="Center"> 
       A line of text.<LineBreak /> 
       <LineBreak /> 
       A line of text.<LineBreak /> 
       <LineBreak /> 
       A line of text.<LineBreak /> 
       <LineBreak /> 
       A line of text.<LineBreak /> 
       </TextBlock> 
      </StackPanel> 
     </Border> 
    </Grid> 
</UserControl> 

、そのような問題のための明白な解決策はPreviewKeyDownイベントを処理することですが、残念ながらこれは、Silverlight 2には使用できません任意のアイデアは歓迎されるであろう(と、なぜSilverlightのイベントのルーティングの簡単な説明それがそのまま動作しています)。

+0

賛成ですか? – Noldorin

答えて

2

あなたは、メインのUIElementからのユーザ入力を管理することができますApplication.Current.RootVisual

Application.Current.RootVisual.KeyDown += Application_KeyDown 

は、その後、あなたはApplication_KeyDownメソッドで、キーボードからのすべてのユーザー入力を処理することができます。

この問題を見ることもできます。Handling KeyDown event in a Canvas

1

私が提供したxamlを試してみましたが、KeyDownイベントを渡す際に問題はありませんでした。

これを引き起こす可能性のあるもの:Silverlightプラグインは、フォーカスされている場合にのみ入力イベントを表示します。したがって、ブラウザでSilverlightコンテンツをクリックして、キーを押す前に入力フォーカスを与えてみてください。

問題が解決するかどうかを教えてください。

+0

実際、KeyDownイベントをキャッチしていたルートUserControlページのようです。そのXAMLで指定されたUserControlが実際はSwitcherPageのコンテンツ/子であったため、私の記事で説明した状況はやや不正確でした。 – Noldorin

+0

(続き)私の質問はこれです:SwitcherPageのコンテンツページにユーザーの入力イベントをキャプチャできるようにすることはできますか?私ができない場合は、SwitcherPageのイベントを処理して指示するのは簡単な回避策ですが、より直接的な解決策があるのか​​不思議です。とにかくお返事ありがとうございます。 – Noldorin

+0

他のポスターがRootVisualでイベントを提案して処理するときに、これを行うことができます。これを行う場合は、ツリーからUserControlを削除するときに、このイベントからハンドラを削除する必要があります。そうしないと、UserControlは引き続きイベントを受信します。 – KeithMahoney

関連する問題