我有一个 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无法获得焦点,因此focused
和Unfocused
事件将永远不会在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/