1

我有一个带有一组按钮的 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 事件没有被触发。

有什么提示吗?

4

1 回答 1

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 执行相同的操作,然后执行一些操作(请参阅在 WinRT-XAML 中是否为 Click、Tapped 和 PointerPressed 同义词?)。我不能确定是否连接到它们两个可能会导致一些奇怪的问题(例如单击和点击都被调用一次)但看起来你可能只是想订阅被点击事件。

编辑:

只是补充一点。有时我会遇到这样的情况,即使你做对了所有事情(这里等于你煞费苦心地仔细检查了所有内容,并且据你所知一切都是正确的),事件处理程序仍然无法工作。老实说,我只见过这种情况发生在组件的组合比你拥有的更复杂的组合时(例如那些涉及几乎所有你能想象到的自定义类型的东西......自定义面板、数据模板选择器、项目模板选择器等)并且我不确定我是否只是不时地忽略某些东西,或者 Microsoft 代码中是否存在合法错误。

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

foo.Tapped += (sender, args) => { /*do something here */ };
于 2014-02-01T13:46:40.563 回答