locked
Список с переходами RRS feed

  • Вопрос

  • Здравствуйте, я новенький. Хотел создать обычный список в котором много пунктов (больше 30) и чтобы нажимая на каждый из пунктов меня перебрасывало на другую страницу(каждый пункт списка должен быть ссылкой на новую страницу. Так вот единственный способ такое сделать,который я знаю я просто сделать кучу кнопок (button) , но , очевидно , это оч долго и нудно . Должен быть метод покороче. Пожалуйста помогите, подскажите.

    Буду очень-очень благодарен если напишите ещё и код. Или шаблон какой найдётся...

     
    16 июня 2013 г. 19:40

Ответы

  • Доброго времени суток!

    Не совсем понял, что у вас за ситуация, если что поправьте. Мне представляется, что у вас есть задача сделать список из 30+ элементов Button и при этом вы задаете ссылки переходов вручную. 

    Можно так например, но опять же, там где я в цикле задаю тэги (ID страницы), вам придется присваивать уникальный адрес, но это все равно наверное быстрее будет.

    XAML:

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <ListBox Height="500" HorizontalAlignment="Left" Name="MyButtonsList" VerticalAlignment="Top" Width="439" Margin="0,41,0,0">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Button 
                                Margin="40,10,0,10" 
                                Content="{Binding Content}"
                                Height="75"
                                Width="300"
                                Tag="{Binding IdPage}"
                                Click="myButton_Click">                            
                            </Button>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Grid>

    Пример как можно привязать 30 кнопок к этому списку:

      public class MyPage
        {
            public string IdPage { get; set; }
            public string Content { get; set; }
        } 
    
    
       private void Binding()    
        {
           for (int i = 0; i <= 30; i++)
             {
                  var page = new MyPage()
                  {
                      IdPage = i.ToString(),
                      Content = "Button №" + i.ToString(),
                  };
                  MyButtonsList.Items.Add(page);
             }          
          }   

    И пример перехода на разные страницы по клику:

    private void myButton_Click(object sender, RoutedEventArgs e)
            {
                Button myButton = (Button)sender;
                string IdPage = (string)myButton.Tag;
                if (IdPage != null)
                {
                    NavigationService.Navigate(new Uri("MyPage" + IdPage + ".xaml", UriKind.Relative));
            
                }
            }
    Если интерфейс будет тормозить при создании такого списка, пишите сюда.



    • Изменено Alexandr Zherebtsov 16 июня 2013 г. 21:25
    • Помечено в качестве ответа AlboWolf 16 июня 2013 г. 21:38
    16 июня 2013 г. 21:18

Все ответы

  • Доброго времени суток!

    Не совсем понял, что у вас за ситуация, если что поправьте. Мне представляется, что у вас есть задача сделать список из 30+ элементов Button и при этом вы задаете ссылки переходов вручную. 

    Можно так например, но опять же, там где я в цикле задаю тэги (ID страницы), вам придется присваивать уникальный адрес, но это все равно наверное быстрее будет.

    XAML:

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <ListBox Height="500" HorizontalAlignment="Left" Name="MyButtonsList" VerticalAlignment="Top" Width="439" Margin="0,41,0,0">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Button 
                                Margin="40,10,0,10" 
                                Content="{Binding Content}"
                                Height="75"
                                Width="300"
                                Tag="{Binding IdPage}"
                                Click="myButton_Click">                            
                            </Button>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Grid>

    Пример как можно привязать 30 кнопок к этому списку:

      public class MyPage
        {
            public string IdPage { get; set; }
            public string Content { get; set; }
        } 
    
    
       private void Binding()    
        {
           for (int i = 0; i <= 30; i++)
             {
                  var page = new MyPage()
                  {
                      IdPage = i.ToString(),
                      Content = "Button №" + i.ToString(),
                  };
                  MyButtonsList.Items.Add(page);
             }          
          }   

    И пример перехода на разные страницы по клику:

    private void myButton_Click(object sender, RoutedEventArgs e)
            {
                Button myButton = (Button)sender;
                string IdPage = (string)myButton.Tag;
                if (IdPage != null)
                {
                    NavigationService.Navigate(new Uri("MyPage" + IdPage + ".xaml", UriKind.Relative));
            
                }
            }
    Если интерфейс будет тормозить при создании такого списка, пишите сюда.



    • Изменено Alexandr Zherebtsov 16 июня 2013 г. 21:25
    • Помечено в качестве ответа AlboWolf 16 июня 2013 г. 21:38
    16 июня 2013 г. 21:18
  • Спасибо большое. Я не имел ввиду что сделать именно элементов button . я просто не знаю как по-другому.
    16 июня 2013 г. 21:39
  • Спасибо большое. Я не имел ввиду что сделать именно элементов button . я просто не знаю как по-другому.

    Скачайте Microsoft.Phone.Controls.Toolkit.WP8 и примеры к нему.
    16 июня 2013 г. 21:51
  • Спасибо большое. Я не имел ввиду что сделать именно элементов button . я просто не знаю как по-другому.
     Ну, собственно говоря, вместо элемента Button в шаблоне DataTemplate можно использовать любой другой контрол. :)
    16 июня 2013 г. 21:55
  • Два маленьких вопроса что такое data template и binding  ? )

    16 июня 2013 г. 22:01
  • Если очень коротко и контексте нашего примера, то DataTemplate - это шаблон, который описывает видимый элемент списка ListBox. Нам не нужно в Xaml описывать 30 кнопок, достаточно описать один раз шаблон для этих кнопок. А Binding это привязка данных к нашему шаблону. Т.е. указывая в шаблоне Content = "{Binding Content}" мы говорим, что в это свойство подставим свойство Content из объекта. Или Tag = "(Binding IdPage}", т.е. свойство Tag элемента Button установим в значение свойства IdPage нашего объекта, что мы создавали в цикле, в примере. Ну это конечно немного исковерканное описание, точнее вы можете почитать об Data Binding например здесь. Или вот пример еще один. В интернете много статей по данной тематике, советую ознакомиться, это 100% пригодится вам в дальнейшем. :)
    16 июня 2013 г. 22:24
  • Сrf;bnt ,пожалуйста, а где в коде давать название каждому из  button. и где давать именно для каждого button переход на новую страницу. 

    Простите за такие вопросы. Но я всего две недели занимаюсь . и много ещё не понимаю .

    Спасибо ещё раз за помощь .

    16 июня 2013 г. 22:38
  • Названия давать в принципе не обязательно, но можно например в шаблоне написать:

     <Button 
        Margin="40,10,0,10" 
        Content="{Binding Content}"
        Name="{Binding Name}" 
        Height="75"
        Width="300"
        Tag="{Binding IdPage}"  
        Click="myButton_Click">                            
     </Button>

    И уже в коде генерировать для каждой кнопки уникальное имя (соответсвеноо в класс MyPage нужно будет добавить поле Name):

    private void Binding()    
        {
           for (int i = 0; i <= 30; i++)
             {
                  var page = new MyPage()
                  {
                      IdPage = i.ToString(),
                      Content = "Button №" + i.ToString(),
                      Name = "NameButton"  + i.ToString(),
                  };
                  MyButtonsList.Items.Add(page);
             }          
          }   	
    

    Как вы видете обработчик событий на клик по кнопке у всех кнопок будет один, он указан в шаблоне:

     
    Click="myButton_Click"

    А уже в обработчике вы проверяете какая кнопка у вас нажата в данный момент и в зависимости от этого переходите на соответсвующую страницу. У вас у каждой кнопки есть уникальный ID:

     Tag="{Binding IdPage}"

    По нему вы можете определиться с переходом. IdPage имеет тип string и в принципе вы можете сразу записывать туда адреса страниц, например, IdPage = "MyFirstPage.xaml", IdPage = "MySecondPage.xaml" и т.д.

    и тогда в обработчике события написать:

    private void myButton_Click(object sender, RoutedEventArgs e)
            {
                Button myButton = (Button)sender;
                string IdPage = (string)myButton.Tag; //получаем уникальный адрес для перехода на страницу
                if (IdPage != null)
                {
                    NavigationService.Navigate(new Uri(IdPage, UriKind.Relative));
            
                }
            }

    У всех элементов управления есть свойство Tag типа object. Это означает, что вы можете присвоить этому свойству почти все что угодно и потом привести Tag к нужному вам типу:

    string IdPage = (string)myButton.Tag;

    или

    int IdPage = (int)myButton.Tag;

    или

    MyCustomObject IdPage  = (MyCustomObject)myButton.Tag;

    Единственный вопрос это в том, насколько удобно вам будет в цикле присваивать названия страниц для переход для каждой кнопки. Возможно это удобнее будет сделать с помощью case в самом обработчике.


    17 июня 2013 г. 4:56