xamarin.forms - Xamarin Form : Custom Relative Touch event in renderer stops Command in XAML -
i have created layout like,
-contentpage
--touchablerelativelayout(override touch event in renderer shown in below code snippet)(command bind in xaml file not working)
----stacklayout
------customimagerenderer
------labelrenderer
pcl : xaml command set called(which not working if touch event overridden in renderer :
<contentview.content> <touchableview:touchablerelativelayout x:name="userdetailscontent" > <touchableview:touchablerelativelayout.gesturerecognizers> <tapgesturerecognizer command="{binding keypadentercommand}" commandparameter="{binding peoplemodeldata}" /> </touchableview:touchablerelativelayout.gesturerecognizers> <stacklayout orientation="vertical" horizontaloptions="centerandexpand" > <render-circleimage:circleimage source="{binding peoplemodeldata.profileurl}" verticaloptions="center" heightrequest="70" widthrequest="70" > </render-circleimage:circleimage> <label x:name="titletext" fontfamily="{staticresource boldfont}" text="{binding peoplemodeldata.name}" horizontaltextalignment="center" textcolor="black" > </label> </stacklayout> </touchableview:touchablerelativelayout> </contentview.content> xamarin.android : customrenderer
public class touchablerelativelayoutrenderer : viewrenderer { public touchablerelativelayoutrenderer() { } protected override void onelementchanged(elementchangedeventargs<xamarin.forms.view> e) { base.onelementchanged(e); var touchablerelativelayout = e.newelement touchablerelativelayout; var thisview = this; thisview.touch += (object sender, toucheventargs args) => { if (args.event.action == motioneventactions.down) { touchablerelativelayout.onpressed(); } else if (args.event.action == motioneventactions.up || args.event.action == motioneventactions.move) { touchablerelativelayout.onreleased(); } }; } } pcl : touchablerelativelayout abstract class (this 2 eventhandler works)
public class touchablerelativelayout : relativelayout { public event eventhandler pressed; public event eventhandler released; public virtual void onpressed() { pressed?.invoke(this, eventargs.empty); backgroundcolor = color.blue; } public virtual void onreleased() { released?.invoke(this, eventargs.empty); backgroundcolor = color.transparent; } } problem : if renderer touch event code not commented, below mentioned code snippet xaml not working :
<touchableview:touchablerelativelayout.gesturerecognizers> <tapgesturerecognizer command="{binding keypadentercommand}" commandparameter="{binding peoplemodeldata}" /> </touchableview:touchablerelativelayout.gesturerecognizers> so how handle both touchevent , command work same ui.
found solution below mentioned changes :
change in pcl : touchablerelativelayout abstract class
public class touchablerelativelayout : relativelayout { public event eventhandler pressed; public event eventhandler released; public virtual void onpressed() { pressed?.invoke(this, eventargs.empty); backgroundcolor = color.blue; } public virtual void onreleased() { released?.invoke(this, eventargs.empty); backgroundcolor = color.transparent; if (command != null) command.execute(commandparameter); } public static readonly bindableproperty commandproperty = bindableproperty.create("command", typeof(icommand), typeof(touchablerelativelayout), (object)null, bindingmode.oneway, (bindableproperty.validatevaluedelegate)null, (bindableproperty.bindingpropertychangeddelegate)null, (bindableproperty.bindingpropertychangingdelegate)null, (bindableproperty.coercevaluedelegate)null, (bindableproperty.createdefaultvaluedelegate)null); public static readonly bindableproperty commandparameterproperty = bindableproperty.create("commandparameter", typeof(object), typeof(touchablerelativelayout), (object)null, bindingmode.twoway, (bindableproperty.validatevaluedelegate)null, (bindableproperty.bindingpropertychangeddelegate)null, (bindableproperty.bindingpropertychangingdelegate)null, (bindableproperty.coercevaluedelegate)null, (bindableproperty.createdefaultvaluedelegate)null); public icommand command { { return (icommand)this.getvalue(commandproperty); } set { this.setvalue(commandproperty, (object)value); } } public object commandparameter { { return this.getvalue(commandparameterproperty); } set { this.setvalue(commandparameterproperty, value); } } } and change in xaml : command bind property of element rather using gesturerecognizer
<contentview.content> <touchableview:touchablerelativelayout x:name="userdetailscontent" command="{binding keypadentercommand}" commandparameter="{binding peoplemodeldata}" > <stacklayout orientation="vertical" horizontaloptions="centerandexpand" > <render-circleimage:circleimage source="{binding peoplemodeldata.profileurl}" verticaloptions="center" heightrequest="70" widthrequest="70" > </render-circleimage:circleimage> <label x:name="titletext" fontfamily="{staticresource boldfont}" text="{binding peoplemodeldata.name}" horizontaltextalignment="center" textcolor="black" > </label> </stacklayout> </touchableview:touchablerelativelayout> </contentview.content> now works touch , command functionality both.
Comments
Post a Comment