locked
Динамическое создание страниц windows phone RRS feed

  • Вопрос

  • В приложении для wp заранее неизвесно сколько нужно страниц.

    В зависимости от пользователя страницы должны добавляться динамически.

    Как динамически создать страницу по шаблону и как управлять ей?

    Страниц может быть до 20

    4 ноября 2013 г. 8:55

Ответы

  • Здравствуйте.

    Сделал семпл и проверил, всё скроллится отлично в красной области:

    Вся страница:

    <phone:PhoneApplicationPage
        x:Class="PhoneApp1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="True">
    
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
                <TextBlock Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
                <TextBlock Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
            </StackPanel>
    
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <phone:Pivot Title="pivot">
                    <phone:PivotItem Header="item1">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            
                            <TextBlock Text="123"/>
                            
                            <ScrollViewer Grid.Row="1"
                                          VerticalScrollBarVisibility="Disabled"
                                          HorizontalScrollBarVisibility="Visible" Background="Red">
                                <ItemsControl>
                                    <TextBlock Text="111 "/>
                                    <TextBlock Text="222 "/>
                                    <TextBlock Text="333 "/>
                                    <TextBlock Text="444 "/>
                                    <TextBlock Text="555 "/>
                                    <TextBlock Text="666 "/>
                                    <TextBlock Text="777 "/>
                                    <TextBlock Text="888 "/>
                                    <TextBlock Text="999 "/>
                                    <TextBlock Text="000 "/>
                                    <TextBlock Text="111 "/>
                                    <TextBlock Text="222 "/>
                                    <TextBlock Text="333 "/>
                                    <TextBlock Text="444 "/>
                                    <TextBlock Text="555 "/>
                                    <TextBlock Text="666 "/>
                                    <TextBlock Text="777 "/>
                                    <TextBlock Text="888 "/>
                                    <TextBlock Text="999 "/>
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <VirtualizingStackPanel Orientation="Horizontal"/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                </ItemsControl>
                            </ScrollViewer>
    
                            <TextBlock Text="footer" Grid.Row="2"/>
                        </Grid>
                    </phone:PivotItem>
    
                    <phone:PivotItem Header="item2">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
    
                            <TextBlock Text="123"/>
    
                            <ScrollViewer Grid.Row="1"
                                          VerticalScrollBarVisibility="Disabled"
                                          HorizontalScrollBarVisibility="Visible" >
                                <ItemsControl Background="White">
                                    <TextBlock Text="111 "/>
                                    <TextBlock Text="222 "/>
                                    <TextBlock Text="333 "/>
                                    <TextBlock Text="444 "/>
                                    <TextBlock Text="555 "/>
                                    <TextBlock Text="666 "/>
                                    <TextBlock Text="777 "/>
                                    <TextBlock Text="888 "/>
                                    <TextBlock Text="999 "/>
                                    <TextBlock Text="000 "/>
                                    <TextBlock Text="111 "/>
                                    <TextBlock Text="222 "/>
                                    <TextBlock Text="333 "/>
                                    <TextBlock Text="444 "/>
                                    <TextBlock Text="555 "/>
                                    <TextBlock Text="666 "/>
                                    <TextBlock Text="777 "/>
                                    <TextBlock Text="888 "/>
                                    <TextBlock Text="999 "/>
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <VirtualizingStackPanel Orientation="Horizontal"/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                </ItemsControl>
                            </ScrollViewer>
    
                            <TextBlock Text="footer" Grid.Row="2"/>
                        </Grid>
                    </phone:PivotItem>
                </phone:Pivot>
            </Grid>
        </Grid>
    </phone:PhoneApplicationPage>

    7 ноября 2013 г. 5:56

Все ответы

  • Здравствуйте.

    Может лучше динамически изменять контент страницы, а не создавать новые?

    Опишите, пожалуйста, детальнее.

    4 ноября 2013 г. 9:27
  • приложение о погоде

    сколько будет городов добавлено неизвестно

    переход от города к городу планируется перелистыванием страниц

    Прокрутка pivot уже есть на странице (занимает треть страницы) и будет на каждной следующей, а pivot в pivot вкладывать не рекомендуют.
    • Изменено tsiganoff 4 ноября 2013 г. 9:36
    4 ноября 2013 г. 9:31
  • А что находится в Вашем первом Pivot? Нельзя ли в него добавлять айтемы через биндинг на ItemsSource коллекции с городами?
    4 ноября 2013 г. 14:44
  • в pivot отображается прогноз почасово на определенный день, таких дней 5. 

    Прогноз на каждый день перелистывается на странице одного города

    Сейчас пробую заменить pivot на scrollViewer.

    Тогда наверное можно будет использовать pivot и в него динамически добавлять новые странички.

    Ну, а в принципе, можно ли динамически создавать новые страницы?

    4 ноября 2013 г. 15:47
  • 1. Насколько я знаю, динамически создавать Page нельзя, т.к. на них никак не снавигируетесь.

    2. В Вашем случае Вам не нужно генерировать Page динамически, просто сделайте 2 страницы, на первой у Вас будут как раз Pivot с городами, а на самом pivot Item будет ссылка на недельную погоду. Или же разместите на самом pivot item погоду со скроллом. В общем, есть куда работать. Про MVVM так же почитайте, полезная и удобная вещь.

    4 ноября 2013 г. 17:57
  • Можно использовать одну страницу, как шаблон, а то, какой город открывать, передавать через NavigationContext. Мне кажется это лучший вариант.
    4 ноября 2013 г. 17:58
  • Можно создавать файлы и тупо писать в них код XAML. а потом переходить к ним
    4 ноября 2013 г. 18:00
  • Можно использовать одну страницу, как шаблон, а то, какой город открывать, передавать через NavigationContext. Мне кажется это лучший вариант.
    Как по мне, то пайвот с городами будет выглядеть изящнее. 
    4 ноября 2013 г. 18:02
  • Pivot выглядит конечно изящнее, но тут вылезла новая проблема.

    В pivot нельзя сделать горизонтальную прокрутку у элемента.

    Покрайней мере я пока не знаю как.

    Задача такая, экран разбит на три части, верхняя - средняя - нижняя.

    В средней части находятся данные которые должны прокручиваться по горизонтали.

    Pivot  должен прокручиваться только если тянешь нижнюю треть или вехнюю.

    6 ноября 2013 г. 13:26
  • Здравствуйте.

    Сделал семпл и проверил, всё скроллится отлично в красной области:

    Вся страница:

    <phone:PhoneApplicationPage
        x:Class="PhoneApp1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="True">
    
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
                <TextBlock Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
                <TextBlock Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
            </StackPanel>
    
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <phone:Pivot Title="pivot">
                    <phone:PivotItem Header="item1">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            
                            <TextBlock Text="123"/>
                            
                            <ScrollViewer Grid.Row="1"
                                          VerticalScrollBarVisibility="Disabled"
                                          HorizontalScrollBarVisibility="Visible" Background="Red">
                                <ItemsControl>
                                    <TextBlock Text="111 "/>
                                    <TextBlock Text="222 "/>
                                    <TextBlock Text="333 "/>
                                    <TextBlock Text="444 "/>
                                    <TextBlock Text="555 "/>
                                    <TextBlock Text="666 "/>
                                    <TextBlock Text="777 "/>
                                    <TextBlock Text="888 "/>
                                    <TextBlock Text="999 "/>
                                    <TextBlock Text="000 "/>
                                    <TextBlock Text="111 "/>
                                    <TextBlock Text="222 "/>
                                    <TextBlock Text="333 "/>
                                    <TextBlock Text="444 "/>
                                    <TextBlock Text="555 "/>
                                    <TextBlock Text="666 "/>
                                    <TextBlock Text="777 "/>
                                    <TextBlock Text="888 "/>
                                    <TextBlock Text="999 "/>
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <VirtualizingStackPanel Orientation="Horizontal"/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                </ItemsControl>
                            </ScrollViewer>
    
                            <TextBlock Text="footer" Grid.Row="2"/>
                        </Grid>
                    </phone:PivotItem>
    
                    <phone:PivotItem Header="item2">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
    
                            <TextBlock Text="123"/>
    
                            <ScrollViewer Grid.Row="1"
                                          VerticalScrollBarVisibility="Disabled"
                                          HorizontalScrollBarVisibility="Visible" >
                                <ItemsControl Background="White">
                                    <TextBlock Text="111 "/>
                                    <TextBlock Text="222 "/>
                                    <TextBlock Text="333 "/>
                                    <TextBlock Text="444 "/>
                                    <TextBlock Text="555 "/>
                                    <TextBlock Text="666 "/>
                                    <TextBlock Text="777 "/>
                                    <TextBlock Text="888 "/>
                                    <TextBlock Text="999 "/>
                                    <TextBlock Text="000 "/>
                                    <TextBlock Text="111 "/>
                                    <TextBlock Text="222 "/>
                                    <TextBlock Text="333 "/>
                                    <TextBlock Text="444 "/>
                                    <TextBlock Text="555 "/>
                                    <TextBlock Text="666 "/>
                                    <TextBlock Text="777 "/>
                                    <TextBlock Text="888 "/>
                                    <TextBlock Text="999 "/>
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <VirtualizingStackPanel Orientation="Horizontal"/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                </ItemsControl>
                            </ScrollViewer>
    
                            <TextBlock Text="footer" Grid.Row="2"/>
                        </Grid>
                    </phone:PivotItem>
                </phone:Pivot>
            </Grid>
        </Grid>
    </phone:PhoneApplicationPage>

    7 ноября 2013 г. 5:56
  • Да, правда, все работает. Не доглядел.

    стояло HorizontalScrollBarVisibility="Disabled" из-за этого не работало.

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

    7 ноября 2013 г. 8:07