usercontrol中未引发XAML按钮单击或点击事件

usercontrol中未引发XAML按钮单击或点击事件,xaml,winrt-xaml,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://sch

我有一个带有按钮集合的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事件处理程序都指向同一个方法(“OnClicked”)。但是,这些事件对代表有不同的签名。Click事件需要一个签名为()的方法:

当抽头事件需要签名为()的方法时:

因此,这两个方法的签名并不相等,而且似乎不太可能对这两个事件使用相同的方法,因为它们需要不同的委托签名(在后台运行的代码将xaml中的逻辑合并到后面的代码中,应该寻找void OnClick(object,RoutedEventArgs)方法)对于单击处理程序和方法void OnClick(对象,tappedroutedventargs),对于被点击的处理程序)。另外,如果运行时没有找到匹配的处理程序方法(至少对于8.1中的wirnt),我通过测试发现事件处理程序连接将自动失败,而不是抛出异常(我非常确定,对于WPF,这会导致一个错误,这会让人有点困惑)

长话短说,在看不到代码的情况下,我的最佳猜测是OnClick没有与Clicked或Tapped事件的委托类型匹配的签名。除此之外,我还想知道为什么你会同时点击和点击。Tapped是一个广义的事件,它基本上完成了与单击相同的事情,然后是一些(请参阅)。我不能确定是否两者都会引起一些奇怪的问题(比如点击和点击都需要一次点击),但看起来你可能只是想订阅点击事件

编辑:

再补充一点。有时我会遇到这样的情况,即使你做的每件事都是正确的(在这里,你已经仔细地检查了每件事,并且据你所知都是正确的),事件处理程序仍然不能工作。老实说,只有当组件的组合比您所拥有的复杂得多时,我才会看到这种情况发生(例如,涉及几乎所有您可以想象的自定义类型的组件…自定义面板、DataTemplateSelector、ItemTemplateSelector等)我也不确定我是否经常忽略某些东西,或者微软的代码中是否存在合法的bug

无论如何,解决方法总是避免以“正常”方式将其连接到事件处理程序(就像您在这里所做的那样)。为此,为按钮指定一个名称,并在代码隐藏中添加处理程序(如果按钮不在模板中,则直接使用该名称;如果按钮在模板中,则使用OnApplyTemplate中的GetTemplateChild获取该名称)。然后,您可以对名为“foo”的按钮执行类似操作:

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

通过查看代码,我注意到您的Click和Tapped事件处理程序都指向同一个方法(“OnClicked”)。但是,这些事件对代表有不同的签名。Click事件需要一个签名为()的方法:

当抽头事件需要签名为()的方法时:

因此,这两个方法的签名并不相等,而且似乎不太可能对这两个事件使用相同的方法,因为它们需要不同的委托签名(在后台运行的代码将xaml中的逻辑合并到后面的代码中,应该寻找void OnClick(object,RoutedEventArgs)方法)对于单击处理程序和方法void OnClick(对象,tappedroutedventargs),对于被点击的处理程序)。另外,如果运行时没有找到匹配的处理程序方法(至少对于8.1中的wirnt),我通过测试发现事件处理程序连接将自动失败,而不是抛出异常(我非常确定,对于WPF,这会导致一个错误,这会让人有点困惑)

长话短说,在看不到代码的情况下,我的最佳猜测是OnClick没有与Clicked或Tapped事件的委托类型匹配的签名。除此之外,我还想知道为什么你会同时点击和点击。Tapped是一个广义的事件,它基本上完成了与单击相同的事情,然后是一些(请参阅)。我不能确定是否两者都会引起一些奇怪的问题(比如点击和点击都需要一次点击),但看起来你可能只是想订阅点击事件

编辑:

再补充一点。有时我会遇到这样的情况,即使你做的每件事都是正确的(在这里,你已经仔细地检查了每件事,并且据你所知都是正确的),事件处理程序仍然不能工作。老实说,只有当组件的组合比您所拥有的复杂得多时,我才会看到这种情况发生(例如,涉及几乎所有您可以想象的自定义类型的组件…自定义面板、DataTemplateSelector、ItemTemplateSelector等)我也不确定我是否经常忽略某些东西,或者微软的代码中是否存在合法的bug

无论如何,解决方法总是避免以“正常”方式将其连接到事件处理程序(就像您在这里所做的那样)。为此,为按钮指定一个名称,并在代码隐藏中添加处理程序(如果按钮不在模板中,则直接使用该名称;如果按钮在模板中,则使用OnApplyTemplate中的GetTemplateChild获取该名称)。那你就可以做些什么了
void TappedDelegate(object sender, TappedRoutedEventArgs e)
foo.Tapped += (sender, args) => { /*do something here */ };