Windows Phone Panorama + Проблемы с привязкой данных - PullRequest
0 голосов
/ 22 ноября 2010

Я бы хотел, чтобы каждая буква алфавита была единым элементом Windows Phone PanoramaItem. Пожалуйста, просто примите это в данный момент. Каждая буква отображается несколькими способами (курсив, обычный, жирный, другие шрифты ...). Конечно, я мог бы сделать это вручную, но это негибко. Поэтому я решил написать простой класс Letter, который в основном содержит два символа - прописные и строчные буквы. Идея заключалась в том, чтобы связать коллекцию этих писем с панорамой (myPano.ItemsSource = collection;). Вот шаблон:

<DataTemplate 
        x:Name="LetterTemplate">
        <controls:PanoramaItem

            Background="Black"
            HorizontalAlignment="Stretch"
            Name="{Binding Path=UpperCase}"
            ManipulationCompleted="A_ManipulationCompleted"
            >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="0.5*"/>
                <RowDefinition Height="0.5*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.5*"/>
                <ColumnDefinition Width="0.5*"/>
            </Grid.ColumnDefinitions>
            <StackPanel
                Grid.Row="0"
                Grid.Column="0"
                Orientation="Vertical"
                HorizontalAlignment="Stretch">
                <TextBlock
                    Text="{Binding Path=UpperCase}"
                    Foreground="{StaticResource PhoneAccentBrush}"
                    HorizontalAlignment="Center"
                    FontFamily="Segoe WP"
                    FontSize="100" />
                <TextBlock
                    Text="{Binding Path=UpperCase}"
                    HorizontalAlignment="Center"
                    Foreground="White"
                    FontFamily="Courier New"
                    FontSize="100" />
            </StackPanel>
            <StackPanel
                Grid.Row="0"
                Grid.Column="1"
                Orientation="Vertical"
                HorizontalAlignment="Stretch">
                <TextBlock
                    Text="{Binding Path=UpperCase}"
                    Foreground="White"
                    HorizontalAlignment="Center"
                    FontFamily="Segoe WP"
                    FontStyle="Italic"
                    FontSize="100" />
                <TextBlock
                    Text="{Binding Path=UpperCase}"
                    HorizontalAlignment="Center"
                    Foreground="{StaticResource PhoneAccentBrush}"
                    FontStyle="Italic"
                    FontFamily="Courier New"
                    FontSize="100" />
            </StackPanel>
                <StackPanel
                Grid.Row="1"
                Grid.Column="0"
                Orientation="Vertical"
                HorizontalAlignment="Stretch">
                    <TextBlock
                    Text="{Binding Path=LowerCase}"
                    Foreground="{StaticResource PhoneAccentBrush}"
                    HorizontalAlignment="Center"
                    FontFamily="Segoe WP"
                    FontStyle="Italic"
                    FontSize="100" />
                    <TextBlock
                    Text="{Binding Path=LowerCase}"
                    HorizontalAlignment="Center"
                    Foreground="White"
                    FontStyle="Italic"
                    FontFamily="Courier New"
                    FontSize="100" />
                </StackPanel>
                <StackPanel
                Grid.Row="1"
                Grid.Column="1"
                Orientation="Vertical"
                HorizontalAlignment="Stretch">
                    <TextBlock
                    Text="{Binding Path=LowerCase}"
                    Foreground="White"
                    HorizontalAlignment="Center"
                    FontFamily="Segoe WP"
                    FontStyle="Italic"
                    FontSize="100" />
                    <TextBlock
                    Text="{Binding Path=LowerCase}"
                    HorizontalAlignment="Center"
                    Foreground="{StaticResource PhoneAccentBrush}"
                    FontStyle="Italic"
                    FontFamily="Courier New"
                    FontSize="100" />
                </StackPanel>
            </Grid>
    </controls:PanoramaItem>

Я знаю, что он не очень ориентирован на производительность при программировании для Windows Phone, но давайте пока оставим это так.

Панорама была заполнена простым циклом в конструкторе телефонной страницы, перебирая символьный код от «A» до «Z», создавая соответствующую букву и добавляя ее в коллекцию алфавитов. Это работало хорошо, но было довольно медленно: мне пришлось ждать около 3 секунд, пока оно не отобразилось, что недопустимо.

Мое первое решение этой проблемы состояло в том, чтобы ограничить коллекцию алфавитов 5 буквами и отредактировать 4 из них при изменении выбора. Я пробовал несколько подходов, но в основном моя проблема заключается в обновлении PanoramaItems, когда произошла модификация.

Удалить и добавить Письма из коллекции: Уничтожить красивые переходы, никак. Заставить коллекцию запускать CollectionChanged при изменении свойства содержащейся буквы: пробовал так же, как и раньше. UpdateTarget () BindingExpression: метод, по-видимому, недоступен в .NET CE.

Может быть, я что-то упустил или просто использовал совершенно неподходящие подходы. Как бы вы это сделали?

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 25 ноября 2010

Имейте в виду, что 26 PanoramaItems могут замедлить производительность.

Если посмотреть на первый пункт в разделе Best Practices здесь , он говорит:

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

0 голосов
/ 25 ноября 2010

Спасибо за ответы!

@ decyclone: ​​Странно, я не видел твоего ... Во всяком случае, может быть, я попробую. Мне просто интересно, насколько это отличается от моего решения с коллекцией. Я реализовал NotifyPropertyChanged в письме и запустил его, но PanoramaItem не обновлялся автоматически. Зачем это делать сейчас?

@ MartinHN: я знаю, что это не лучшее решение, если говорить о производительности. Это то, что я сказал в первой записи, и причина, по которой я спросил здесь:)

0 голосов
/ 25 ноября 2010

Если вы используете следующую структуру класса:

class LetterContainer
{
    public Letter Letter { get; set; }
}

class Letter
{
    public String UpperCase { get; set; }
    public String LowerCase { get; set; }
}

И вместо создания списка класса Letter создайте список типа LetterContainer, чтобы связать его с элементом управления Parorama. Конечно, вам нужно будет изменить привязки в вашем Template, который вы создали. Теперь все, что вам нужно сделать, это изменить значения свойства Letter в LetterContainer объектах. Таким образом, CollectionChanged события не будут запущены. Но убедитесь, что вы вызываете события PropertyChanged для свойств Letter, UpperCase и LowerCase.

0 голосов
/ 25 ноября 2010

Для полноты картины: я оставил это первым способом (26 PanoramaItems), просто удалил StackPanels из моего DataTemplate и изменил ObservableCollection на List.Согласно этой записи советов и приемов мне следовало бы получить небольшое повышение производительности.Все в порядке.

Еще ... Если вы знаете решение моей конкретной проблемы обновления одного PanoramaItem (Target of Binding) на Windows Phone, пожалуйста, дайте мне знать.

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...