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

标签 xamarin mvvm xamarin.forms prism

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

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

<views:CustomCalendar x:Name="cal">
       <views:Calendar.Behaviors>
             <prism:EventToCommandBehavior 
                           EventName="Unfocused"
                           Command="{Binding UnfocusedCalandar}"/>
       </views:Calendar.Behaviors>
</views:Calendar>

最佳答案

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

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

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

<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>

关于xamarin - Xamarin.Forms检测自定义ContentView单击外部事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62210620/

相关文章:

xamarin - 可以使用相同的源代码为 Windows、MacOS 构建 xamarin 应用程序吗?

android - 在 Xamarin.Forms 中布局背景图像

c# - 用于将中间用户输入从 ViewModel 传递到 Model 的 MVVM 模式

xamarin.forms - Xamarin App Shell - 在代码中关闭弹出菜单

c# - 在 Xamarin 中使用 HtmlAgilityPack 等待 AJAX

Android 应用内产品价格存储/显示

android - 无法解析 DaggerAppComponent

c# - 如何在 MVVM 中的 wpf 中设置来自资源的图像源

c# - 如何清除 MVVM Light xamarin 中 ViewModel 的数据?

C# Xamarin : How to change navigation bar color?