Xaml 如何在每次单击ListView中的StackLayout(具有手势识别器)时调用IOS自定义渲染

Xaml 如何在每次单击ListView中的StackLayout(具有手势识别器)时调用IOS自定义渲染,xaml,xamarin,xamarin.ios,xamarin.forms,xamarin-studio,Xaml,Xamarin,Xamarin.ios,Xamarin.forms,Xamarin Studio,我正在尝试为ios构建一个选框,因此我编写了一个自定义标签渲染并使用动画来实现选框,我在stackLayout中调用自定义标签(stackLayout位于列表的ViewCell中)。此StackLayout具有手势识别器。 单击时,我希望每次调用Marquee,以便我可以在手势单击时启动和停止Marquee。不是每次单击视图时都调用渲染器吗? 只有在调用ViewModel构造函数时才会调用它。如何使渲染器在每次单击堆栈布局的手势时都被调用。下面是我尝试过的代码 Xaml页面: <Data

我正在尝试为ios构建一个选框,因此我编写了一个自定义标签渲染并使用动画来实现选框,我在stackLayout中调用自定义标签(stackLayout位于列表的ViewCell中)。此StackLayout具有手势识别器。 单击时,我希望每次调用Marquee,以便我可以在手势单击时启动和停止Marquee。不是每次单击视图时都调用渲染器吗? 只有在调用ViewModel构造函数时才会调用它。如何使渲染器在每次单击堆栈布局的手势时都被调用。下面是我尝试过的代码

Xaml页面:

 <DataTemplate>
     <ViewCell>
     <StackLayout x:Name="MarqueeLabelGestureView" HorizontalOptions="FillAndExpand">
                                                                          <controls:MarqueeLabelLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"  />
                                                                              <StackLayout.GestureRecognizers>
                                                                                <TapGestureRecognizer Command="{Binding Source={x:Reference ResourceListView}, Path=BindingContext.OnMarqueeClicked}"  CommandParameter="{Binding .}" />
                                                              </StackLayout.GestureRecognizers>                                             
                                                                      </StackLayout>
     </ViewCell>
 </DataTemplate>

自定义渲染代码:

    namespace VCS.FieldManager.UI.iOS.CustomRenderer
{
   public class CustomLabelRender:LabelRenderer
    {
        public CustomLabelRender()
        {

        }
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                UILabel marqueelabel = Control;
                marqueelabel.Frame = new CGRect(40, 40, marqueelabel.Frame.X + 200, 40);

                     MessagingCenter.Send("", "OpenMarqueeLabel");
                if (!GridEntryViewModel.isMarqueeClicked)
                {
                    UIView.Animate(6, 0, UIViewAnimationOptions.CurveLinear| UIViewAnimationOptions.Repeat,
                  () =>
                  {
                       UIView.SetAnimationRepeatCount(1);
                      marqueelabel.Transform = CoreGraphics.CGAffineTransform.MakeTranslation(-100,0);
                  }, null);
                    //  marqueelabel.Lines = 1200;
                }
                }

        }
    }
}
命名空间VCS.FieldManager.UI.iOS.CustomRenderer
{
公共类CustomLabelRender:LabelRenderer
{
公共CustomLabelRender()
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
UILabel marqueelabel=控件;
框架=新的CGRect(40,40,框架X+200,40);
MessagingCenter.Send(“,“openmarqueelab”);
如果(!GridEntryViewModel.IsMarquee已单击)
{
UIView.Animate(6,0,UIViewAnimationOptions.CurveLinear | UIViewAnimationOptions.重复,
() =>
{
UIView.SetAnimationRepeatCount(1);
marqueelabel.Transform=CoreGraphics.cGraffineTransform.MakeTransform(-100,0);
},空);
//marqueelabel.Lines=1200;
}
}
}
}
}

在MarqueeLabel上公开开始和停止方法,或根据需要使用MessagingCenter传递开始/停止消息。Marquee在自定义渲染类中编写。我没法用手势说话。