繁体   English   中英

将参数传递到Tap Gesture Xamarin表单

[英]Pass Parameters to Tap Gesture Xamarin Forms

我试图将参数从一个页面传递到另一个页面。 这些传递的参数将用于从SQL表中进行选择。 该页面的构建如下:(后面的代码)

private MainRoutePageViewModel mainroutepageviewmodel;
private List<RouteInfo> routeinfo;

构造函数:

 public MainRoutePageViewDetail(MessagDatabase database)
    {
        InitializeComponent();

        BindingContext = mainroutepageviewmodel = new MainRoutePageViewModel(database,Navigation);
        //_listOfProperties = mainroutepageviewmodel.GetLabelInfo();

        ScrollView scrollview = new ScrollView();

        StackLayout mainstack = new StackLayout();
        mainstack.Spacing = 0;
        mainstack.Padding = 0;

        //mainstack.HeightRequest = 2000;

        routeinfo = mainroutepageviewmodel.GetLabelInfo();


        string _routePlacer = "";

        foreach (var i in routeinfo)
        {
            mainstack.Children.Add(NewRouteName(i.RouteName));


            mainstack.Children.Add(BuildNewRoute(i.RouteStops,i));


            _routePlacer = i.RouteName;
        }

        scrollview.Content = mainstack;

        Content = scrollview;


    }// end of constructor

BuildNewRoute方法:

public StackLayout BuildNewRoute(List<string> location, RouteInfo routeinfo)
    {

        StackLayout stackLayout = new StackLayout();

        //stackLayout.HeightRequest = 1000;

        foreach (var i in location) {

            StackLayout stackLayout2 = new StackLayout();
            stackLayout2.HeightRequest = 200;

            Grid grid = new Grid();
            grid.ColumnSpacing = 0;
            grid.RowSpacing = 0;



            grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
            grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(15, GridUnitType.Star) });
            grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
            grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(20, GridUnitType.Star) });
            grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(20, GridUnitType.Star) });
            grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(20, GridUnitType.Star) });
            grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(20, GridUnitType.Star) });

            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(55, GridUnitType.Star) });
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(18, GridUnitType.Star) });
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(18, GridUnitType.Star) });
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(18, GridUnitType.Star) });                
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(40, GridUnitType.Star) });
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(30, GridUnitType.Star) });
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(10, GridUnitType.Star) });
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(15, GridUnitType.Star) });
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(5, GridUnitType.Star) });


            TapGestureRecognizer ArrowtapGesture = new TapGestureRecognizer();
            ArrowtapGesture.Tapped += ArrowtapGesture_Tapped;

            // Arrow icon
            Image arrowimage = new Image();
            arrowimage.Source = "Resources/arrow.png";
            arrowimage.VerticalOptions = LayoutOptions.Center;
            arrowimage.HorizontalOptions = LayoutOptions.Center;
            arrowimage.GestureRecognizers.Add(ArrowtapGesture);
            grid.Children.Add(arrowimage,7,6);

            // total weight labels
            Label weightlabel = new Label();
            weightlabel.Text = "Total Weight [kg]: ";
            grid.Children.Add(weightlabel,1,5,3,4);

            // total items labels
            Label itemsLabel = new Label();
            itemsLabel.Text = "Total Items: ";
            grid.Children.Add(itemsLabel, 1, 5, 4, 5);

            // underline labels
            Label firstunderline = new Label();
            Label secondunderline = new Label();

            firstunderline.BackgroundColor = Color.Black;
            secondunderline.BackgroundColor = Color.Black;
            grid.Children.Add(firstunderline,0,9,0,1);
            grid.Children.Add(secondunderline,0,9,2,3);

            // address label
            Label labelLocation = new Label();
            labelLocation.Text = i;
            grid.Children.Add(labelLocation, 0, 3);

            //sequence label
            Label sequencelable = new Label();
            sequencelable.Text = "Sequence: ";
            sequencelable.VerticalTextAlignment = TextAlignment.Center;
            grid.Children.Add(sequencelable, 0, 1);

            // slot label
            Label slotlabel = new Label();
            slotlabel.Text = "ETA/Slot: ";
            slotlabel.VerticalTextAlignment = TextAlignment.Center;
            grid.Children.Add(slotlabel,1,4,1,2);

            // time label
            Label timelabel = new Label();
            timelabel.Text = "Time: ";
            timelabel.VerticalTextAlignment = TextAlignment.Center;
            grid.Children.Add(timelabel, 4, 5,1,2);

            // Status label
            Label statuslabel = new Label();
            statuslabel.Text = "Status: ";
            statuslabel.VerticalTextAlignment = TextAlignment.Center;
            grid.Children.Add(statuslabel, 5, 6,1,2);

            //start button
            Button startbutton = new Button();
            startbutton.Text = "Pending";
            startbutton.BackgroundColor = Color.Gray;
            grid.Children.Add(startbutton,5,8,4,6);

            // Phone book image
            Image bookImage = new Image();
            //bookImage.BackgroundColor = Color.White;
            bookImage.Source = "Resources/phoneWithBook.png";
            bookImage.VerticalOptions = LayoutOptions.Center;
            bookImage.HorizontalOptions = LayoutOptions.Center;
            grid.Children.Add(bookImage,1,2,6,7);


            //Globe image
            Image GlobeImage = new Image();
           // GlobeImage.BackgroundColor = Color.White;
            GlobeImage.Source = "Resources/globe.png";
            GlobeImage.VerticalOptions = LayoutOptions.Center;
            GlobeImage.HorizontalOptions = LayoutOptions.Center;
            grid.Children.Add(GlobeImage, 2, 3, 6, 7);


            stackLayout2.Children.Add(grid);

            stackLayout.Children.Add(stackLayout2);
        }

        return stackLayout;
    }

如您可能看到的那样,它遍历收集的数据列表,并将网格和标签添加到主StackLayout中。 这不是页面构建正常的问题。

您将看到带有附加轻击手势的箭头图标图像。 此轻击手势使用视图模型打开下一页。

点击手势:

 private async void ArrowtapGesture_Tapped(object sender, EventArgs e)
    {         

        await mainroutepageviewmodel.OpenStopDetail();
    }

和OpenStopDetail方法:

 public async Task OpenStopDetail()
    {
        await Navigation.PushAsync(new StopDetailPageView());

    }

我想知道如何将参数从tap事件传递到StopDetailView页面。 特别是序列标签中的文本。

我尝试过的某些事情,在tap事件中一直使用了强制类型转换,但这似乎与选择的项有关。 换句话说,它使我可以访问图像属性。 这对我的情况不利。

我似乎无法找到一种方法来单独访问每个标签属性以作为参数传递。 抱歉,如果不清楚,很难解释。 让我知道是否需要更多细节。

Tapped事件的发送者将是手势识别器附加到的控件-在您的情况下为Image。 因此,您可以将数据添加到Image的属性之一,以便从事件处理程序访问数据。

// assign parameter to ClassId (must be a string)
arrowimage.ClassId = "blah";
arrowimage.GestureRecognizers.Add(ArrowtapGesture);

private async void ArrowtapGesture_Tapped(object sender, EventArgs e)
{         
    // retrieve parameter from sender's ClassId
    var parm = ((Image)sender).ClassId;
    await mainroutepageviewmodel.OpenStopDetail();
}

您应该能够使用TapGestureRecognizer的CommandParameter。

在XAML中:

<TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"
                      CommandParameter="Value"/>

e.Parameter将是您在CommandParameter中设置的任何参数。

private async void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e)

  <Image.GestureRecognizers> <TapGestureRecognizer Tapped="Share_Tapped" CommandParameter="{Binding .}"/> </Image.GestureRecognizers> 

enter code here
    private void Share_Tapped(object sender, TappedEventArgs e)
    {
        var contact = (e.Parameter) as DetailList;      


    }

结果

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM