Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin选择器在UI上显示不需要的元素_C#_Xamarin_Xamarin.forms_Modal Dialog_Picker - Fatal编程技术网

C# Xamarin选择器在UI上显示不需要的元素

C# Xamarin选择器在UI上显示不需要的元素,c#,xamarin,xamarin.forms,modal-dialog,picker,C#,Xamarin,Xamarin.forms,Modal Dialog,Picker,在这一点上把我的头发拔出来。我的选取器在UI和/或选取器的Title属性(如果启用)上显示了一个恼人的行。我只是想要选择器,而不是它下面的UI上显示的东西。你知道如何实现这一目标吗?我必须使用自定义渲染器,还是缺少一些简单的东西 注意:以下示例中的列表故意为空 在没有标题的情况下,我单击现有按钮,该行显示,再次单击它,模式显示: 使用标题,我单击现有按钮,行和标题显示,再次单击,模式显示: 不知道为什么我要按两次按钮。但这只是在最初的页面加载。如果我退出模式并再次单击按钮,它会立即出现,

在这一点上把我的头发拔出来。我的选取器在UI和/或选取器的Title属性(如果启用)上显示了一个恼人的行。我只是想要选择器,而不是它下面的UI上显示的东西。你知道如何实现这一目标吗?我必须使用自定义渲染器,还是缺少一些简单的东西

注意:以下示例中的列表故意为空

在没有标题的情况下,我单击现有按钮,该行显示,再次单击它,模式显示:

使用标题,我单击现有按钮,行和标题显示,再次单击,模式显示:

不知道为什么我要按两次按钮。但这只是在最初的页面加载。如果我退出模式并再次单击按钮,它会立即出现,没有双击。不确定这是否与我最初的问题有关,但我想我会把它包括在内,以获取更多信息

NewSubjectPage.xaml(为简洁起见切碎)

NewSubjectViewModel.cs(为简洁起见切碎)

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();
}