Xamarin.Forms检测自定义ContentView单击外部事件

问题描述 投票:0回答:1

我有一个CustomCalendar元素,通过扩展ContentView并在另一个ContentPage中使用此自定义视图来创建。我试图使用Unfocused事件来检测外部点击。但是问题是它没有触发事件处理程序。您能否建议我以更好的方式对点击之外的元素进行检测。

我在页面上以这种方式使用我的自定义视图,并使用Unfocused EventToCommandBehavior

<views:CustomCalendar x:Name="cal">
       <views:Calendar.Behaviors>
             <prism:EventToCommandBehavior 
                           EventName="Unfocused"
                           Command="{Binding UnfocusedCalandar}"/>
       </views:Calendar.Behaviors>
</views:Calendar>
xamarin mvvm xamarin.forms prism
1个回答
0
投票
每当VisualElement失去焦点时,都会引发

Unfocused事件,并且它仅适用于能够获得焦点的元素,不幸的是ContentView无法获得焦点,因此focusedUnfocused事件将永远不会在ContentView上触发。

可以获得焦点的元素:条目,编辑器,选择器,等等..


作为临时解决方法,您可以将ContentView包装到StackLayout中,同时在ContentView和parenet布局上设置点击手势,它自己的点击手势将阻止父视图的手势。

<StackLayout BackgroundColor="Red" >
        <ContentView HeightRequest="100" WidthRequest="100" BackgroundColor="Blue" >
            <ContentView.GestureRecognizers>
                <TapGestureRecognizer Tapped="ContentViewTap"/>
            </ContentView.GestureRecognizers>
        </ContentView>


        <CollectionView BackgroundColor="Gray" Focused="CollectionView_Focused" >
            <CollectionView.ItemsSource>
                <x:Array Type="{x:Type x:String}">
                    <x:String>Baboon</x:String>
                    <x:String>Capuchin Monkey</x:String>
                    <x:String>Blue Monkey</x:String>
                    <x:String>Squirrel Monkey</x:String>
                    <x:String>Golden Lion Tamarin</x:String>
                    <x:String>Howler Monkey</x:String>
                    <x:String>Japanese Macaque</x:String>
                </x:Array>
            </CollectionView.ItemsSource>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid Padding="10">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <Image Grid.RowSpan="2"
                       Source="dog.png"
                       Aspect="AspectFill"
                       HeightRequest="60"
                       WidthRequest="60" />
                        <Label Grid.Column="1"
                       Text="{Binding }"
                       FontAttributes="Bold" />
                        <Label Grid.Row="1"
                       Grid.Column="1"
                       Text="{Binding }"
                       FontAttributes="Italic"
                       VerticalOptions="End" />

                        <Grid.GestureRecognizers>
                            <TapGestureRecognizer Tapped="StackLayoutTap" />
                        </Grid.GestureRecognizers>
                    </Grid>


                </DataTemplate>
            </CollectionView.ItemTemplate>


        </CollectionView>

        <StackLayout.GestureRecognizers>
            <TapGestureRecognizer Tapped="StackLayoutTap" />
        </StackLayout.GestureRecognizers>
    </StackLayout>
© www.soinside.com 2019 - 2024. All rights reserved.