как лучше всего использовать жест касания на изображении, чтобы go открыть новую страницу в mvvm? Я пробовал использовать жест касания, но похоже, что он не работает - PullRequest
0 голосов
/ 01 августа 2020

Я немного новичок в MVVM, и меня это немного смущает. Вот коды для файлов .cs и xaml. Есть ли более простой способ go об этом?

publi c частичный класс Categories: ContentPage {

    public Categories()
    {
        InitializeComponent();
        BindingContext = new MainViewModel();
    }

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


        object SelectedItem = null;
        if (SelectedItem != null)
        {
            CategoryViewModel myselecteditem = sender as CategoryViewModel;

            switch (myselecteditem.CategoryImage)
            {

                case "Arts.png":
                    await Navigation.PushModalAsync(new Artspage());
                    break;
                case "Music.png":
                    await Navigation.PushModalAsync(new Artspage());
                    break;
         }
     }
 }

}

вот категории.XAML страница, на которой было нажато изображение, должна go перейти на новую страницу. Я точно уверен, какая ошибка сделана, что упущено или неправильно размещено. Пробовал все, что знаю.

<ContentPage.BindingContext>
    <viewmodel:MainViewModel />
</ContentPage.BindingContext>

<AbsoluteLayout>

    <StackLayout>
        
        <ScrollView
            AbsoluteLayout.LayoutBounds="20,300, 400, 620">

            <FlexLayout
                x:Name="flow"
                BindableLayout.ItemsSource="{Binding Categories}"
                Direction="Column"
                HeightRequest="990"
                HorizontalOptions="Center"
                Wrap="Wrap">          

                <BindableLayout.ItemTemplate>
                    <DataTemplate>
                        
                       <pancake:PancakeView>
                             
                        <Grid>

                            <Image
                               Source="{Binding CategoryImage}"
                                 BackgroundColor="Transparent"
                                  TranslationX="-3"
                                  TranslationY="40"
                                  VerticalOptions="End"
                                   HorizontalOptions="Center"
                                  Margin="0,10,0,50">
                          
                        <Image.GestureRecognizers>
                       <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/>
                      </Image.GestureRecognizers>

                          </Image>               
                        </Grid>
                            
                       </pancake:PancakeView>
                         
                    </DataTemplate>
                </BindableLayout.ItemTemplate>
            </FlexLayout>
        </ScrollView>
    </StackLayout>

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

Если вы предпочитаете выполнять навигацию из кода страницы позади:

private async void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
  CategoryViewModel myselecteditem = sender.BindingContext as CategoryViewModel;
  if (myselecteditem == null) return;  

  switch (myselecteditem.CategoryImage)
     {
            case "Arts.png":
                await Navigation.PushModalAsync(new ArtsPage());
                break;
            case "Music.png":
                await Navigation.PushModalAsync(new MusicPage());
                break;
      }
}

Более разумным является выполнение навигации с помощью ICommand прямо из самой виртуальной машины, если вы работаете с MVVM.

0 голосов
/ 02 августа 2020

Нашел решение

    public  async void TapGestureRecognizer_Tapped(object sender, EventArgs e)
    {
        string Name = "";
        Image imageSender = (Image)sender;
        if (imageSender.GestureRecognizers.Count > 0)
        {
            var gesture = (TapGestureRecognizer)imageSender.GestureRecognizers[0];
           Name = (string)gesture.CommandParameter;
        }
        switch (Name)
        {
            case "Arts":
                await Navigation.PushAsync(new Artspage());
                break;
            case "Music":
                await Navigation.PushAsync(new musicPage());
                break;

        }
    }
0 голосов
/ 01 августа 2020

В обработчике событий касания вы проверяете, является ли SelectedItem нулевым, но вы никогда не назначаете ему ничего, поэтому команды навигации могут не выполняться. Также в обработчике событий sender будет Image, к которому вы прикрепили свой обработчик событий.

Не зная, как ваша ViewModel, вам может помочь что-то вроде этого:

private async void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
    if (sender != null)
    {
        CategoryViewModel myselecteditem = sender.BindingContext as CategoryViewModel; // Get the binding context of your image, set a break point here to make sure BindingContext is equal to CategoryViewModel

        switch (myselecteditem.CategoryImage)
        {

            case "Arts.png":
                await Navigation.PushModalAsync(new Artspage());
                break;
            case "Music.png":
                await Navigation.PushModalAsync(new Artspage());
                break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...