在usercontrol中未提出的XAML按钮单击或点击事件

时间:2013-05-13 12:31:08

标签: xaml winrt-xaml

我有一个带有一组按钮的XAML用户控件。

我的XAML如下:

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" Width="85"
>

<Grid Background="#7F010305" HorizontalAlignment="Left">
    <Grid.RowDefinitions>            
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />            
    </Grid.ColumnDefinitions>

    <Button x:Name="Zoom" Grid.Row="0" Grid.Column="0" Width="40" Height="40" Margin="15,0,15,15" Click="OnClicked" Tapped="OnClicked" />
    <Button x:Name="Pan"  Grid.Row="1" Grid.Column="0" Width="40" Height="40" Margin="15,0,15,15" Click="OnClicked" Tapped="OnClicked" />
    <Button x:Name="Contrast" Grid.Row="2" Grid.Column="0" Width="40" Height="40" Margin="15,0,15,15" Click="OnClicked" Tapped="OnClicked"/>
    <Button x:Name="Brightness" Grid.Row="3" Grid.Column="0" Width="40" Height="40" Margin="15,0,15,15" Click="OnClicked" Tapped="OnClicked"/>

</Grid>

不知何故,点击或点按事件不会被提升。我尝试了各种选项,但Click或Tapped事件没有被解雇。

任何提示?

1 个答案:

答案 0 :(得分:1)

通过查看代码,我注意到Click和Tapped事件处理程序都指向同一个方法(“OnClicked”)。但是,这些事件对代表有不同的签名。 Click事件需要一个带签名的方法(http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.primitives.buttonbase.click.aspx):

void ClickDelegate(object sender, RoutedEventArgs e)

而Tapped事件需要一个带签名的方法(http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.input.tappedeventhandler.aspx):

void TappedDelegate(object sender, TappedRoutedEventArgs e)

因此,这两种方法的签名不相同,并且您似乎不太可能对两个事件使用相同的方法,因为它们需要不同的委托签名(在后台运行以合并逻辑的代码)您的xaml到您的代码后面应该为您的Click处理程序寻找一个方法void OnClick(object,RoutedEventArgs),为您的Tapped处理程序找一个方法void OnClick(object,TappedRoutedEventArgs)。此外,如果运行时没有找到匹配的处理程序方法(至少对于8.1中的wirnt),我通过测试发现事件处理程序挂钩将默默地失败而不是抛出异常(我很确定对于WPF这会导致错误,这使它有点混乱)。

长篇大论没有能够看到你的代码背后的最佳猜测是OnClick没有与Clicked或Tapped事件的委托类型相匹配的签名。除此之外,我也想知道为什么你迷上了Tapped和Clicked。 Tapped是广义事件,基本上与Clicked相同,然后是一些(参见Are Click, Tapped, and PointerPressed synonymous in WinRT-XAML?)。我不能肯定地说是否勾住它们可能会导致一些奇怪的问题(例如单击和敲击被称为单击)但看起来你可能只想订阅Tapped事件

编辑:

只是为了补充一点。有时我发生过这样的事情,即使你做的一切都正确(在这里等于你已经精心地仔细检查了所有内容,并且就你所知这一切都是正确的)事件处理程序仍然无法正常工作。老实说,当组件的复杂组合比你拥有的组件复杂得多时,我只见过这种情况(例如那些涉及你可以想象的几乎所有自定义类型的东西......自定义面板,datatemplateselectors,itemtemplateselectors等)和am不确定我是否经常不断地忽略某些内容,或者Microsoft代码中是否存在合法的错误。

无论如何,解决方法总是避免以“正常”方式将事件处理程序挂起(就像你在这里做的那样)。为此,请为按钮指定名称,并在后面的代码中添加处理程序(如果按钮不在模板中,则直接使用名称,或者如果它在模板中,则使用OnApplyTemplate中的GetTemplateChild来获取它)。然后你可以为名为'foo'的按钮做这样的事情:

foo.Tapped += (sender, args) => { /*do something here */ };