如何处理在DataTemplate内的Grid上输入按键事件

时间:2018-01-16 07:21:57

标签: c# xaml uwp

我有一个GridView,在GridView的DateTemplate里面我有一个网格,为此我想处理要处理的回车键事件。现在我正在使用Tapped事件,当通过鼠标点击它时它工作正常。我也尝试过使用Keyup和Keydown事件,但没有一个是触发事件。

Xaml代码:

  <DataTemplate x:Key="NormalTemplate" x:DataType="models:ProductLocal">
        <Grid Height="140" Width="140"  Tag="{Binding}" Tapped="TappedEvent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <TextBlock Text="{x:Bind Name}" VerticalAlignment="Center" HorizontalAlignment="Center" Height="50"  Margin="4" Grid.Row="0" TextWrapping="WrapWholeWords" MaxLines="2" TextTrimming="CharacterEllipsis"></TextBlock>
            <TextBlock Grid.Row="1" Margin="4" HorizontalAlignment="Center" TextWrapping="Wrap" MaxLines="2" TextTrimming="CharacterEllipsis">

                        <Run Text="{x:Bind SomeText}"></Run>
            </TextBlock>
            <customcontrols:CustomButton Grid.Row="2" Margin="4" Tag="{Binding}" Style="{StaticResource ButtonNoHoverStyle}" HorizontalContentAlignment="Right" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Tapped="EditProduct_Tapped">
                <Button.Content>
                    <Image Source="../Assets/Icons/iconEditNormal.png" Height="44" CacheMode="BitmapCache"></Image>
                </Button.Content>
            </customcontrols:CustomButton>
        </Grid>
    </DataTemplate>

3 个答案:

答案 0 :(得分:0)

如果在单击鼠标按钮时需要事件,请尝试使用

MouseUp="UserControl1_MouseUp" MouseDown="UserControl1_MouseDown"

根据您的需要。 Tapped事件用于触摸显示,键事件用于处理与键盘的交互。

答案 1 :(得分:0)

我做了一些尝试,这是我的网格:

<Grid Name="test" Height="140" KeyUp="Grid_KeyUp" Background="LightBlue" >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <TextBox Text="txttest" VerticalAlignment="Center" HorizontalAlignment="Center" Height="50"  Margin="4" Grid.Row="0" IsReadOnly="True" 
                       ></TextBox>
            <TextBox Grid.Row="1" Margin="4" HorizontalAlignment="Center"  TextWrapping="Wrap" >
            </TextBox>
            <Button Grid.Row="2" Margin="4,4,0,-9"   
                    HorizontalContentAlignment="Right" 
                    VerticalAlignment="Stretch" 
                    HorizontalAlignment="Stretch" >
                <Button.Content>
                    <Image  Height="44" ></Image>
                </Button.Content>
            </Button>
        </Grid>
代码背后的代码:

private void Grid_KeyUp(object sender, KeyEventArgs e)
    {
        MessageBox.Show(e.Key.ToString());
    }

答案 2 :(得分:0)

要获得Grid捕获键盘输入,它只有一个选项 - Grid内的控件具有焦点但不处理输入,因此它会冒泡到Grid

Grid本身无法获得焦点,因为只有来自Control的类可以被聚焦,而Grid只是一个布局控件,它没有此功能。

要解决此问题,您可以将KeyDown事件添加到GridView本身,然后使用SelectedItem知道 Enter 按钮。

在XAML中,您在KeyDown上设置GridView事件:

<GridView x:Name="MyGridView" KeyDown="GridView_KeyDown">

现在在代码隐藏中:

private void Grid_KeyDown(object sender, KeyRoutedEventArgs e)
{
    var gridView = (GridView)sender;
    if (e.Key == Windows.System.VirtualKey.Enter)
    {
        var selectedItem = gridView.SelectedItem;
        //do something
    }
}