参数传递到双击手势Xamarin窗体

问题描述:

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

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

    } 

我想知道如何通过对StopDetailView页传递从水龙头事件参数。 特别是来自序列标签的文字。

有些事情,我都试过了,一直使用自来水事件的铸造但这似乎被绑定到所选择的项目。换句话说,它给我访问图像属性。这对我的情况没有好处。

我似乎无法找到一种方法来访问每一个标签属性作为参数传递。对不起,如果这不明确,很难解释。让我知道是否需要更多细节。

Tapped事件的发件人将是手势识别器附加的控件 - 在您的情况下,图像。因此,您可以将数据添加到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(); 
} 
+0

的伟大工程。谢谢 – user3355961