C# Xamarin选择器在UI上显示不需要的元素
在这一点上把我的头发拔出来。我的选取器在UI和/或选取器的Title属性(如果启用)上显示了一个恼人的行。我只是想要选择器,而不是它下面的UI上显示的东西。你知道如何实现这一目标吗?我必须使用自定义渲染器,还是缺少一些简单的东西 注意:以下示例中的列表故意为空 在没有标题的情况下,我单击现有按钮,该行显示,再次单击它,模式显示: 使用标题,我单击现有按钮,行和标题显示,再次单击,模式显示: 不知道为什么我要按两次按钮。但这只是在最初的页面加载。如果我退出模式并再次单击按钮,它会立即出现,没有双击。不确定这是否与我最初的问题有关,但我想我会把它包括在内,以获取更多信息 NewSubjectPage.xaml(为简洁起见切碎) NewSubjectViewModel.cs(为简洁起见切碎)C# Xamarin选择器在UI上显示不需要的元素,c#,xamarin,xamarin.forms,modal-dialog,picker,C#,Xamarin,Xamarin.forms,Modal Dialog,Picker,在这一点上把我的头发拔出来。我的选取器在UI和/或选取器的Title属性(如果启用)上显示了一个恼人的行。我只是想要选择器,而不是它下面的UI上显示的东西。你知道如何实现这一目标吗?我必须使用自定义渲染器,还是缺少一些简单的东西 注意:以下示例中的列表故意为空 在没有标题的情况下,我单击现有按钮,该行显示,再次单击它,模式显示: 使用标题,我单击现有按钮,行和标题显示,再次单击,模式显示: 不知道为什么我要按两次按钮。但这只是在最初的页面加载。如果我退出模式并再次单击按钮,它会立即出现,
class NewSubjectViewModel:BaseViewModel
{
私人观测收集图;
公众可观察收集图表
{
获取{返回图表;}
专用设备
{
图表=价值;
OnPropertyChanged();
}
}
公共命令LoadChartsCommand{get;set;}
公共新闻SubjectViewModel()
{
LoadChartsCommand=
新命令(
async()=>await ExecuteLoadChartsCommand()
);
}
专用异步任务ExecuteLoadChartsCommand()
{
尝试
{
指示符号rRunning=真;
var list=wait App.Database.GetChartsAsync();
图表=新的可观察集合(列表);
}
捕获(例外情况除外)
{
Debug.WriteLine(ex);
}
}
}
谢谢你的帮助!如果您需要查看任何其他内容,请告诉我。首先,我无法再现模式问题,直到第二次单击按钮后才显示。为此,您可能需要提供更多的代码。为了使用您的代码示例,我必须替换
var list=wait App.Database.GetChartsAsync()代码>,以模拟返回空列表的长时间运行的任务。还必须使用名称
属性创建图表
类型。更不用说BaseViewModel
。在将来,请提供所有代码来重现该问题,以便尽量减少试图帮助您的人员所需的工作。有一个关于堆栈溢出的概念称为MCVE(最小、完整、可验证的示例):
也就是说,也许第一次点击实际上是聚焦模拟器并使其成为活动应用程序,然后第二次是第一次实际点击按钮?这个我可以复制。注意,如果emulator不是前台应用程序,您必须单击它一次,使其处于活动状态,然后您的应用程序将处理单击
至于不受欢迎的UI,您确实意识到选择器UI基本上是一个可单击的标签,当单击时显示实际的选择器模式?因此,当您使其可见时,您将使其可见的是标签UI,其中包含行和标题(如果已设置),当您聚焦该标签时,将显示实际的选择器对话框。如果您根本不想看到UI标签,那么为什么要让它可见呢?您可以在不使其可见的情况下对其进行聚焦,因此只需删除行newsubjectexichrtpck.IsVisible=true代码>
作为旁注,当您调用\u viewModel.LoadChartsCommand.Execute(null)时调用异步方法的代码>,var list=wait App.Database.GetChartsAsync()
,因此在设置Charts属性之前返回LoadChartsCommand
,然后返回调用\u viewModel.LoadChartsCommand.Execute(null)之后的代码代码>也会在LoadChartsCommand
真正完成之前执行,因此您会使拾取程序可见,并在LoadChartsCommand
完成之前对其进行聚焦,因此如果您正在加载要拾取程序显示的实际项目,它们可能第一次就不在那里。也许这只是示例代码,但我认为没有理由在这里使用命令,而是应该调用一个等待的任务。您没有绑定到LoadChartsCommand
,因此我认为您没有理由在这种情况下使用命令。相反,我建议将ExecuteLoadChartsCommand
公开并直接调用它,例如:
private async void NewSubjectExisChrtBtn_Clicked(object sender, EventArgs e)
{
//_viewModel.LoadChartsCommand.Execute(null); // Returns immediately, so picker not loaded with items yet.
await _viewModel.ExecuteLoadChartsCommand(); // Waits for method to finish before before presenting the picker.
//NewSubjectExisChrtPck.IsVisible = true;
NewSubjectExisChrtPck.Focus();
}
你的意思是当点击选择器时标题下方显示的Fuscia线吗?(看着你贴的图片)@pinedax,是的,那一行。按钮下面不应该显示任何内容。乔纳森,谢谢MCVE提醒,我的疏忽,对不起大家!不管怎样,你为我解决了这个问题——真了不起!关于IsVisible,你是对的,当我删除那行时,问题就消失了。采纳了您的建议,解决了我的第二个问题,并提高了我的性能。微软很幸运有你,再次感谢你-D
public partial class NewSubjectPage : ContentPage
{
private string chartName;
private readonly NewSubjectViewModel _viewModel;
public string ChartName
{
get => chartName;
private set
{
chartName = value;
OnPropertyChanged();
}
}
public NewSubjectPage()
{
InitializeComponent();
BindingContext = _viewModel = new NewSubjectViewModel();
chartName = "";
}
private void NewSubjectExisChrtBtn_Clicked(object sender, EventArgs e)
{
_viewModel.LoadChartsCommand.Execute(null);
NewSubjectExisChrtPck.IsVisible = true;
NewSubjectExisChrtPck.Focus();
}
private void NewSubjectExisChrtPck_SelectedIndexChanged(object sender, EventArgs e)
{
var picker = (Picker)sender;
int selectedIndex = picker.SelectedIndex;
if (selectedIndex != -1)
{
ChartName = picker.Items[picker.SelectedIndex];
}
}
private void NewSubjectExisChrtPck_Unfocused(object sender, FocusEventArgs e)
{
NewSubjectExisChrtPck.IsVisible = false;
NewSubjectExisChrtPck.Unfocus();
}
}
class NewSubjectViewModel : BaseViewModel
{
private ObservableCollection<Chart> charts;
public ObservableCollection<Chart> Charts
{
get { return charts; }
private set
{
charts = value;
OnPropertyChanged();
}
}
public Command LoadChartsCommand { get; set; }
public NewSubjectViewModel()
{
LoadChartsCommand =
new Command(
async () => await ExecuteLoadChartsCommand()
);
}
private async Task ExecuteLoadChartsCommand()
{
try
{
IndicatorRunning = true;
var list = await App.Database.GetChartsAsync();
Charts = new ObservableCollection<Chart>(list);
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
}
}
private async void NewSubjectExisChrtBtn_Clicked(object sender, EventArgs e)
{
//_viewModel.LoadChartsCommand.Execute(null); // Returns immediately, so picker not loaded with items yet.
await _viewModel.ExecuteLoadChartsCommand(); // Waits for method to finish before before presenting the picker.
//NewSubjectExisChrtPck.IsVisible = true;
NewSubjectExisChrtPck.Focus();
}