Event_Handler 选择器的完成按钮
Event_Handler of the Done button of a picker
我有一个带有项目列表的 xamarin 选择器,我想在 iPhone 上按下 "done" 按钮并在 [=25= 上按下 "Oke" 按钮时删除选择器].
我有删除选择器的代码。但我不知道 event_Handler 可能会发生什么。
代码:
Picker picker = new Picker
{
Title = "What's in the slot?",
VerticalOptions = LayoutOptions.CenterAndExpand
//HorizontalOptions = LayoutOptions.Center
};
private void Displaypickerview(int row, int column)
{
if (status == "filling board")
{
foreach (string text in pickerText)
{
picker.Items.Add(text);
}
foreach (string ore in oreLevels)
{
picker.Items.Add(ore);
}
picker.SelectedIndexChanged += (sender, args) =>
{
if (picker.SelectedIndex == -1)
{
}
else
{
//change value of cell and button
Picker picker = (Picker)sender;
int index = picker.SelectedIndex;
if (index < pickerText.Length)
{
board[row, column].Text = pickerText[index - 1];
}
else {
board[row, column].Text = oreLevels[index - 1 - pickerText.Length];
}
}
};
}
else if (status == "choosing item")
{
}
}
它在 iPhone 上的外观示例:
不幸的是,在您的情况下,您不能对 Android 和 iOS 使用相同的事件,因为:
Currently the Picker control sends the SelectedIndexChanged event on Android after the OK button is pressed. However, on iOS the event is sent whenever the user scrolls the picker and lets it stop on an item
这是已知问题,我引用了 here。
您应该结合使用 SelectedIndexChanged 和 Unfocus 事件来实现您的目标。您可以在本主题中找到一些解决方案
https://forums.xamarin.com/discussion/20847/picker-selection-event
更新:
看来我没有正确理解你的问题。如果我现在这样做,那么您必须使用自定义渲染器并在其中指定所需的逻辑。
为 iOS。创建继承自 PickerRenderer 的自定义渲染器并实现类似的东西:
protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged(e);
var extendedPicker = e.NewElement as ExtendedPicker;
if (extendedPicker == null) return;
var toolbar = new UIToolbar(new CGRect(0.0f, 0.0f, Control.Frame.Size.Width, 44.0f));
toolbar.Items = new[]
{
new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace),
new UIBarButtonItem("Done",
UIBarButtonItemStyle.Done,
delegate {
Control.ResignFirstResponder();
})
};
if (this.Control != null)
{
Control.InputAccessoryView = toolbar;
}
}
对于 Andorid 来说,开箱即用
现在有一个特定于平台的配置选项,可让您在 iOS 上启用它。
您将特定选择器上的 PickerMode
指定为仅在有人在 iOS 上点击完成后 select。
<ContentPage ...
xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core">
<StackLayout Margin="20">
<Picker ... Title="Select a monkey" ios:Picker.UpdateMode="WhenFinished">
...
</Picker>
...
</StackLayout>
</ContentPage>
Picker.On<iOS>
方法指定此平台特定将仅在 iOS 上 运行。 Xamarin.Forms.PlatformConfiguration.iOSSpecific
命名空间中的 Picker.SetUpdateMode 方法用于控制项 selection 何时出现,UpdateMode 枚举提供两个可能的值:
Immediately
– 项目 selection 在用户浏览选择器中的项目时发生。这是 Xamarin.Forms.
中的默认行为
WhenFinished
– 项目 selection 只有在用户按下选择器中的完成按钮后才会出现。
阅读文档以获取有关控件的更多信息。 https://docs.microsoft.com/sr-latn-rs/xamarin/xamarin-forms/platform/ios/picker-selection
我有一个带有项目列表的 xamarin 选择器,我想在 iPhone 上按下 "done" 按钮并在 [=25= 上按下 "Oke" 按钮时删除选择器].
我有删除选择器的代码。但我不知道 event_Handler 可能会发生什么。
代码:
Picker picker = new Picker
{
Title = "What's in the slot?",
VerticalOptions = LayoutOptions.CenterAndExpand
//HorizontalOptions = LayoutOptions.Center
};
private void Displaypickerview(int row, int column)
{
if (status == "filling board")
{
foreach (string text in pickerText)
{
picker.Items.Add(text);
}
foreach (string ore in oreLevels)
{
picker.Items.Add(ore);
}
picker.SelectedIndexChanged += (sender, args) =>
{
if (picker.SelectedIndex == -1)
{
}
else
{
//change value of cell and button
Picker picker = (Picker)sender;
int index = picker.SelectedIndex;
if (index < pickerText.Length)
{
board[row, column].Text = pickerText[index - 1];
}
else {
board[row, column].Text = oreLevels[index - 1 - pickerText.Length];
}
}
};
}
else if (status == "choosing item")
{
}
}
它在 iPhone 上的外观示例:
不幸的是,在您的情况下,您不能对 Android 和 iOS 使用相同的事件,因为:
Currently the Picker control sends the SelectedIndexChanged event on Android after the OK button is pressed. However, on iOS the event is sent whenever the user scrolls the picker and lets it stop on an item
这是已知问题,我引用了 here。
您应该结合使用 SelectedIndexChanged 和 Unfocus 事件来实现您的目标。您可以在本主题中找到一些解决方案 https://forums.xamarin.com/discussion/20847/picker-selection-event
更新: 看来我没有正确理解你的问题。如果我现在这样做,那么您必须使用自定义渲染器并在其中指定所需的逻辑。
为 iOS。创建继承自 PickerRenderer 的自定义渲染器并实现类似的东西:
protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged(e);
var extendedPicker = e.NewElement as ExtendedPicker;
if (extendedPicker == null) return;
var toolbar = new UIToolbar(new CGRect(0.0f, 0.0f, Control.Frame.Size.Width, 44.0f));
toolbar.Items = new[]
{
new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace),
new UIBarButtonItem("Done",
UIBarButtonItemStyle.Done,
delegate {
Control.ResignFirstResponder();
})
};
if (this.Control != null)
{
Control.InputAccessoryView = toolbar;
}
}
对于 Andorid 来说,开箱即用
现在有一个特定于平台的配置选项,可让您在 iOS 上启用它。
您将特定选择器上的 PickerMode
指定为仅在有人在 iOS 上点击完成后 select。
<ContentPage ...
xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core">
<StackLayout Margin="20">
<Picker ... Title="Select a monkey" ios:Picker.UpdateMode="WhenFinished">
...
</Picker>
...
</StackLayout>
</ContentPage>
Picker.On<iOS>
方法指定此平台特定将仅在 iOS 上 运行。 Xamarin.Forms.PlatformConfiguration.iOSSpecific
命名空间中的 Picker.SetUpdateMode 方法用于控制项 selection 何时出现,UpdateMode 枚举提供两个可能的值:
Immediately
– 项目 selection 在用户浏览选择器中的项目时发生。这是 Xamarin.Forms.
WhenFinished
– 项目 selection 只有在用户按下选择器中的完成按钮后才会出现。
阅读文档以获取有关控件的更多信息。 https://docs.microsoft.com/sr-latn-rs/xamarin/xamarin-forms/platform/ios/picker-selection