簡體   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