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