我正在使用NuGet软件包{{3}}来实现浮动操作按钮。我已经添加了它,但是我无法使clicked事件正常工作。
MyPage.xaml:
<fab:FloatingActionButtonView ImageName="settings_24.png"
ColorNormal="{StaticResource PrimaryColor}"
ColorPressed="{StaticResource PrimaryDarkColor}"
ColorRipple="{StaticResource PrimaryDarkColor}"
x:Name="FABaddTx"
AbsoluteLayout.LayoutFlags="PositionProportional"
AbsoluteLayout.LayoutBounds="1, 1, AutoSize, AutoSize"
Clicked="FAB_Clicked"/>
MyPage.xaml.cs:
private void FAB_Clicked(object sender, EventArgs e)
{
var page = new AddTransactionPage();
Navigation.PushAsync(page);
}
我发现FloatingActionButtonView.Clicked
是一个属性,而不是一个事件,但是它如何工作?我没有可以使用的ItemTapped
或ItemSelected
事件。
我已经看过GitHub存储库中提供的示例代码,可悲的是只有Xamarin.Android代码,而我需要Xamarin.Forms。
答案 0 :(得分:3)
根据源存储库中的this Xamarin.Forms example,它是操作委托属性。
/// <summary>
/// Action to call when clicked
/// </summary>
public Action<object, EventArgs> Clicked { get; set; }
您可以在Page的构造函数中设置委托。
但是,由于它不是实际的事件处理程序,而只是一个void方法,因此,如果要安全地执行异步操作,建议将其设置为async void
方法。
引用Async/Await - Best Practices in Asynchronous Programming
相反,创建一个事件和一个异步事件处理程序,以便可以等待异步操作
MyPage.xaml.cs:
public MyPage() {
//Subscribing to our event here
FabClicked += OnFabClicked;
//FABaddT is already defined in the XAML so just setting the delegate here
FABaddT.Clicked = (sender, args) => {
//Raising the event here and passing sender and event arguments on
FabClicked(sender, args);
};
}
private event EventHandler FabClicked = delegate { };
private async void OnFabClicked(object sender, EventArgs args) {
var page = new AddTransactionPage();
await Navigation.PushAsync(page);
}