Xamarin.Forms.Switch 值更新时发送 Toggled 事件
Xamarin.Forms.Switch sends Toggled event when value is updated
所以我还在Xamarin.Forms
出道。到目前为止一切顺利,如果我抛开我遇到的一些讨厌的错误。这是新人。如果我做错了什么,也许你们中的一个可以告诉我。
基本上,我的界面上有一个 Xamarin.Forms.Switch
,我正在通过 Toggled
事件监听其状态的变化。文档说了这个事件:"Event that is raised when this Switch is toggled by the user."
不幸的是,当我以编程方式更新开关的值时,事件触发了。
var mySwitch = new Switch ();
mySwitch.Toggled += (object sender, ToggledEventArgs e) => {
Console.WriteLine ("Switch.Toggled event sent");
};
mySwitch.IsToggled = true;
有什么方法可以防止事件触发/知道触发它的不是用户?
您遇到的行为是正确的:每次 IsToggled
属性 更改时,开关都会触发 Toggled
事件。
我不确定 Xamarin.Forms documentation 最近是否更新了,但截至今天,它对 Toggled
事件的描述如下:
Event that is raised when this Switch is toggled
示例代码
以下示例代码可防止在 Toggled
事件未被用户触发时处理 Toggled
事件
using System;
using Xamarin.Forms;
namespace SwitchToggle
{
public class SwitchPage : ContentPage
{
public SwitchPage()
{
var mySwitch = new Switch
{
IsToggled = true
};
mySwitch.Toggled += HandleSwitchToggledByUser;
var toggleButton = new Button
{
Text = "Toggle The Switch"
};
toggleButton.Clicked += (sender, e) =>
{
mySwitch.Toggled -= HandleSwitchToggledByUser;
mySwitch.IsToggled = !mySwitch.IsToggled;
mySwitch.Toggled += HandleSwitchToggledByUser;
};
var mainLayout = new RelativeLayout();
Func<RelativeLayout, double> getSwitchWidth = (parent) => parent.Measure(mainLayout.Width, mainLayout.Height).Request.Width;
Func<RelativeLayout, double> getToggleButtonWidth = (parent) => parent.Measure(mainLayout.Width, mainLayout.Height).Request.Width;
mainLayout.Children.Add(mySwitch,
Constraint.RelativeToParent((parent) => parent.Width / 2 - getSwitchWidth(parent) / 2),
Constraint.RelativeToParent((parent) => parent.Height / 2 - mySwitch.Height / 2)
);
mainLayout.Children.Add(toggleButton,
Constraint.RelativeToParent((parent) => parent.Width / 2 - getToggleButtonWidth(parent) / 2),
Constraint.RelativeToView(mySwitch, (parent, view) => view.Y + view.Height + 10)
);
Content = mainLayout;
}
async void HandleSwitchToggledByUser(object sender, ToggledEventArgs e)
{
await DisplayAlert(
"Switch Toggled By User",
"",
"OK"
);
}
}
public class App : Application
{
public App()
{
MainPage = new NavigationPage(new SwitchPage());
}
}
}
每次都会调用 Toggled 事件,当您手动更改切换时,Toggled 事件也会触发。
解决方案刚刚设置
mySwitch.Toggled -= HandleSwitchToggledByUser;
在您手动更改切换值之前,写
mySwitch.Toggled += HandleSwitchToggledByUser;
手动更改切换后,
希望这对您有所帮助
所以我还在Xamarin.Forms
出道。到目前为止一切顺利,如果我抛开我遇到的一些讨厌的错误。这是新人。如果我做错了什么,也许你们中的一个可以告诉我。
基本上,我的界面上有一个 Xamarin.Forms.Switch
,我正在通过 Toggled
事件监听其状态的变化。文档说了这个事件:"Event that is raised when this Switch is toggled by the user."
不幸的是,当我以编程方式更新开关的值时,事件触发了。
var mySwitch = new Switch ();
mySwitch.Toggled += (object sender, ToggledEventArgs e) => {
Console.WriteLine ("Switch.Toggled event sent");
};
mySwitch.IsToggled = true;
有什么方法可以防止事件触发/知道触发它的不是用户?
您遇到的行为是正确的:每次 IsToggled
属性 更改时,开关都会触发 Toggled
事件。
我不确定 Xamarin.Forms documentation 最近是否更新了,但截至今天,它对 Toggled
事件的描述如下:
Event that is raised when this Switch is toggled
示例代码
以下示例代码可防止在 Toggled
事件未被用户触发时处理 Toggled
事件
using System;
using Xamarin.Forms;
namespace SwitchToggle
{
public class SwitchPage : ContentPage
{
public SwitchPage()
{
var mySwitch = new Switch
{
IsToggled = true
};
mySwitch.Toggled += HandleSwitchToggledByUser;
var toggleButton = new Button
{
Text = "Toggle The Switch"
};
toggleButton.Clicked += (sender, e) =>
{
mySwitch.Toggled -= HandleSwitchToggledByUser;
mySwitch.IsToggled = !mySwitch.IsToggled;
mySwitch.Toggled += HandleSwitchToggledByUser;
};
var mainLayout = new RelativeLayout();
Func<RelativeLayout, double> getSwitchWidth = (parent) => parent.Measure(mainLayout.Width, mainLayout.Height).Request.Width;
Func<RelativeLayout, double> getToggleButtonWidth = (parent) => parent.Measure(mainLayout.Width, mainLayout.Height).Request.Width;
mainLayout.Children.Add(mySwitch,
Constraint.RelativeToParent((parent) => parent.Width / 2 - getSwitchWidth(parent) / 2),
Constraint.RelativeToParent((parent) => parent.Height / 2 - mySwitch.Height / 2)
);
mainLayout.Children.Add(toggleButton,
Constraint.RelativeToParent((parent) => parent.Width / 2 - getToggleButtonWidth(parent) / 2),
Constraint.RelativeToView(mySwitch, (parent, view) => view.Y + view.Height + 10)
);
Content = mainLayout;
}
async void HandleSwitchToggledByUser(object sender, ToggledEventArgs e)
{
await DisplayAlert(
"Switch Toggled By User",
"",
"OK"
);
}
}
public class App : Application
{
public App()
{
MainPage = new NavigationPage(new SwitchPage());
}
}
}
每次都会调用 Toggled 事件,当您手动更改切换时,Toggled 事件也会触发。
解决方案刚刚设置
mySwitch.Toggled -= HandleSwitchToggledByUser;
在您手动更改切换值之前,写
mySwitch.Toggled += HandleSwitchToggledByUser;
手动更改切换后,
希望这对您有所帮助