- Home
- Forum
- Xamarin.Forms
- Feature Request: TrackballDestroyed or OnUp event SfChart
Feature Request: TrackballDestroyed or OnUp event SfChart
I've been trying to figure out when the releases their finger on a SfChart so i can set the IsVisible of other UI elements in the page. It would be great if there was an event to show when the user lifted their finger from the chart or if there was an event for when the Trackball was destroyed (opposite of the TrackballCreated event). The OnUp would be the easier one to use, both both could help accomplish this use case.
Thanks!
SIGN IN To post a reply.
5 Replies
SJ
Suyamburaja Jayakumar
Syncfusion Team
April 27, 2020 06:30 AM UTC
Hi Keston Crandall,
Greetings from Syncfusion.
We would like to let you know that, you can achieve your requirement by using the OnLongPress and OnTouchUp override methods of ChartTrackballBehavior as in below code snippet.
C#:
|
public class TrackballBehaviorExt : ChartTrackballBehavior
{
private bool isLongPressActivated = false;
protected override void OnLongPress(float pointX, float pointY)
{
base.OnLongPress(pointX, pointY);
isLongPressActivated = true;
}
protected override void OnTouchUp(float pointX, float pointY)
{
base.OnTouchUp(pointX, pointY);
if (isLongPressActivated)
{
isLongPressActivated = false;
//Write your logic here
}
}
}
|
Note: The above code snippet will support only for android. for iOS please refer below
For iOS support use CustomRenderer class and TouchUp method to achieve your requirement as per the below code snippet.
C#:
|
public class ChartTrackballBehaviorExt : ChartTrackballBehavior
{
public ChartExt chart { get; set; }
public ChartTrackballBehaviorExt()
{
}
protected override void OnLongPress(float pointX, float pointY)
{
chart.TrackballVisible = true;
base.OnLongPress(pointX, pointY);
}
//For Android this override OnTouchUp will work fine after LongPress
protected override void OnTouchUp(float pointX, float pointY)
{
base.OnTouchUp(pointX, pointY);
}
//For iOS after long press TouchUp method called here
public void TouchUp(float pointX, float pointY)
{
if (chart != null)
{
chart.TrackballVisible = false;
//check your logic here for iOS
}
}
}
|
C#:
|
class CustomChartRenderer : SfChartRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<SfChart> e)
{
base.OnElementChanged(e);
var formsChart = Element as Syncfusion.SfChart.XForms.SfChart;
for (int i = 0; i < formsChart.ChartBehaviors.Count; i++)
{
if (formsChart.ChartBehaviors[i] is Syncfusion.SfChart.XForms.ChartTrackballBehavior)
{
var formsTrackball = formsChart.ChartBehaviors[i] as
Syncfusion.SfChart.XForms.ChartTrackballBehavior;
Control.Behaviors.Remove((SFChartBehavior)SfChartRenderer.GetNativeObject(typeof
(Syncfusion.SfChart.XForms.ChartTrackballBehavior), formsTrackball));
CustomTrackballBehavior customTrackball = new CustomTrackballBehavior();
customTrackball.FormsBehavior = formsTrackball;
var properties =
SfChartRenderer.GetPropertiesChanged(typeof(Syncfusion.SfChart.XForms.ChartTrackballBehavior),
formsTrackball);
foreach (var name in properties)
{
ChartTrackballBehaviorMapping.OnChartTrackballBehaviorPropertiesChanged(name,
formsTrackball, customTrackball);
}
SfChartRenderer.SetNativeObject(typeof(Syncfusion.SfChart.XForms.ChartTrackballBehavior),
formsTrackball, customTrackball);
Control.Behaviors.Insert(i, customTrackball);
}
}
}
}
public class CustomTrackballBehavior : ChartTrackballBehaviorHelper
{
public override void LongPressWithGestureRecognizer(UILongPressGestureRecognizer
longPressGestureRecognizer)
{
base.LongPressWithGestureRecognizer(longPressGestureRecognizer);
var locationInChart = longPressGestureRecognizer.LocationInView(Chart);
if (UIGestureRecognizerState.Ended == longPressGestureRecognizer.State)
{
(FormsBehavior as ChartTrackballBehaviorExt).TouchUp((float)locationInChart.X,
(float)locationInChart.Y);
}
}
}
|
XAML:
|
<local:ChartExt x:Name="chart" HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
….
<chart:SfChart.ChartBehaviors>
<local:ChartTrackballBehaviorExt chart="{x:Reference chart}"
ActivationMode="LongPress">
</local:ChartTrackballBehaviorExt>
</chart:SfChart.ChartBehaviors>
</local:ChartExt>
|
More information Please refer the below forum,
Please let us know if you need any further assistance.
Regards,
Suyamburaja J.
KC
Keston Crandall
April 27, 2020 05:25 PM UTC
Thank you this was exactly what i was looking for! Probably would be useful to put this in the Trackball docs
KC
Keston Crandall
April 27, 2020 05:28 PM UTC
For people who come across this in the future if you want TouchMove and not LongPress you don't need to do the iOS workaround. This worked fine
using System;
using Syncfusion.SfChart.XForms;
using App.Controls;
namespace App.Behaviors
{
public class ChartTrackballBehaviorExt : ChartTrackballBehavior
{
public event EventHandler Up;
public event EventHandler Down;
private bool isLongPressActivated = false;
public SfChartExt chart { get; set; }
public ChartTrackballBehaviorExt()
{ }
protected override void OnTouchDown(float pointX, float pointY)
{
base.OnTouchDown(pointX, pointY);
EventHandler eventHandler = Down;
eventHandler?.Invoke(this, null);
}
protected override void OnLongPress(float pointX, float pointY)
{
base.OnLongPress(pointX, pointY);
isLongPressActivated = true;
}
protected override void OnTouchUp(float pointX, float pointY)
{
base.OnTouchUp(pointX, pointY);
EventHandler eventHandler = Up;
eventHandler?.Invoke(this, null);
//if (isLongPressActivated)
//{
// isLongPressActivated = false;
// //Write your logic here for android
// EventHandler eventHandler = Up;
// eventHandler?.Invoke(this, null);
//}
}
}
}
KC
Keston Crandall
April 27, 2020 05:43 PM UTC
You can have the best of both worlds with this. added this if(this.ActivationMode == ChartTrackballActivationMode.TouchMove)
using System;
using Syncfusion.SfChart.XForms;
using App.Controls;
namespace App.Behaviors
{
public class ChartTrackballBehaviorExt : ChartTrackballBehavior
{
public event EventHandler Up;
public event EventHandler Down;
private bool isLongPressActivated = false;
public SfChartExt chart { get; set; }
public ChartTrackballBehaviorExt()
{ }
protected override void OnTouchDown(float pointX, float pointY)
{
base.OnTouchDown(pointX, pointY);
EventHandler eventHandler = Down;
eventHandler?.Invoke(this, null);
}
protected override void OnLongPress(float pointX, float pointY)
{
base.OnLongPress(pointX, pointY);
isLongPressActivated = true;
}
//For Android this override OnTouchUp will work fine after LongPress
protected override void OnTouchUp(float pointX, float pointY)
{
base.OnTouchUp(pointX, pointY);
if(this.ActivationMode == ChartTrackballActivationMode.TouchMove)
{
EventHandler eventHandler = Up;
eventHandler?.Invoke(this, null);
}
else if (isLongPressActivated)
{
isLongPressActivated = false;
//Write your logic here for android
EventHandler eventHandler = Up;
eventHandler?.Invoke(this, null);
}
}
//For iOS after long press TouchUp method called here
public void TouchUp(float pointX, float pointY)
{
if (chart != null)
{
chart.TrackballVisible = false;
//write your logic here for iOS
EventHandler eventHandler = Up;
eventHandler?.Invoke(this, null);
}
}
}
}
SJ
Suyamburaja Jayakumar
Syncfusion Team
April 28, 2020 06:16 AM UTC
Hi Keston Crandall,
Thanks for your suggestion.
Please let us know if you need any further assistance on this.
Regards,
Suyamburaja J.
SIGN IN To post a reply.
- 5 Replies
- 2 Participants
-
KC Keston Crandall
- Apr 25, 2020 11:54 PM UTC
- Apr 28, 2020 06:16 AM UTC