【问题标题】:Silverlight page not catching input eventsSilverlight 页面未捕获输入事件
【发布时间】:2009-02-28 23:46:42
【问题描述】:

我一直试图在我的 Silverlight 应用程序中处理 UserControl(页面)的 KeyDown 事件,但 Silverlight 用户输入功能部分似乎存在一些奇怪的行为。在任何情况下都不会引发该事件。我什至尝试将事件处理程序附加到 UserControl 中的每个容器控件,但仍然没有运气。确实,Silverlight 用户输入“事件路由”系统很新颖,对我来说似乎很奇怪,所以也许这只是我的一个误解,虽然我对如何进行比较无能为力。

以下代码是我正在测试的特定页面的模板。

<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>

在 WPF 中,此类问题的明显解决方案是处理 PreviewKeyDown 事件,但不幸的是,这在 Silverlight 2 中不可用。欢迎任何想法(以及为什么 Silverlight 事件路由的行为如此的简短解释是)。

【问题讨论】:

    标签: silverlight xaml event-handling user-input event-routing


    【解决方案1】:

    您可以从主 UIElement 管理用户输入:Application.Current.RootVisual

    Application.Current.RootVisual.KeyDown += Application_KeyDown
    

    然后您可以在 Application_KeyDown 方法中处理来自键盘的所有用户输入。

    你也可以看看这个问题:Handling KeyDown event in a Canvas

    【讨论】:

      【解决方案2】:

      我尝试了您提供的 xaml,并且在处理 KeyDown 事件时没有遇到问题。

      可能导致它的原因是:Silverlight 插件只有在获得焦点时才会看到输入事件。因此,请尝试单击浏览器中的 Silverlight 内容,在按键之前为其提供输入焦点。

      让我知道这是否解决了您的问题。

      【讨论】:

      • 啊,似乎实际上是根 UserControl 页面正在捕获 KeyDown 事件。我在帖子中描述的情况有点不准确,因为 XAML 中指定的 UserControl 实际上是 SwitcherPage 的内容/子项。
      • (续)所以我现在的问题是:我可以强制 SwitcherPage 的内容页面捕获用户输入事件吗?如果我不能,在处理 SwitcherPage 中的事件然后指导它们时有一个简单的解决方法,但我很好奇是否有更直接的解决方案。无论如何感谢您的回复。
      • 您可以按照其他海报的建议进行操作,并在 RootVisual 上处理该事件。如果您这样做,您要确保在从树中删除 UserControl 时从该事件中删除您的处理程序;否则您的 UserControl 将继续接收事件。
      • 是的,这似乎是最好的解决方案。我将事件处理程序附加到每个页面,但在每个页面的开头检查活动页面。干杯...
      猜你喜欢
      • 1970-01-01
      • 2011-02-13
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多