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

Popular posts from this blog

Sort a complex associative array in PHP -

vb.net - How to ignore if a cell is empty nothing -

recursion - Can every recursive algorithm be improved with dynamic programming? -