Silverlight: показывать одинаковые элементы управления на каждой странице - PullRequest
2 голосов
/ 19 ноября 2010

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

Мой текущий подход использует навигационную рамку в качестве корневого визуала:

App.xaml.cs:

this.RootVisual = new NavFrame();

NevFrame.xaml

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <my:TopSearchBar x:Name="topSearchBar" Grid.Row="0"/>

    <navigation:Frame x:Name="navigationFrame" Source="/HomePage.xaml" Grid.Row="1"/>

    <my:BottomFavoritesBar x:Name="bottomFavoritesBar" Grid.Row="2"/>

</Grid>

Тогда я бы изменил страницы внутри фрейма, оставив постоянные элементы на месте. Это правильный подход или есть какой-то другой предпочтительный шаблон?

Однако, если я сделаю это, я не уверен, как позволить пользовательским элементам управления TopSearchBar и BottomFavoritesBar выполнять навигацию. (В общем, я не уверен, как сделать навигацию прямо из UserControl.)

Когда TopSearchBar был участником каждой страницы, у меня был бы этот код в коде каждой страницы:

topSearchBar.ParentPage = this;

TopSearchBar может затем использовать эту ссылку для навигации:

ParentPage.NavigationService.Navigate(new Uri("/SearchPage.xaml?q=" + searchBox.Text, UriKind.Relative));

Есть ли лучший способ сделать это? Это немного неловко. Если для навигации требуется ссылка на страницу, как я могу передать эту ссылку из NavFrame?

Ответы [ 2 ]

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

Подходящий подход заключается в добавлении свойства зависимости как к TopSearchBar, так и к BottomFavoritesBar, называемому "Навигатор" (или что вы предпочитаете), которое имеет тип INavigate.

.как это: -

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
        <RowDefinition /> 
    </Grid.RowDefinitions> 

    <my:TopSearchBar x:Name="topSearchBar" Grid.Row="0" Navigator="{Binding ElementName=navigationFrame}"/> 

    <navigation:Frame x:Name="navigationFrame" Source="/HomePage.xaml" Grid.Row="1"/> 

    <my:BottomFavoritesBar x:Name="bottomFavoritesBar" Grid.Row="2" Navigator="{Binding ElementName=navigationFrame}" /> 

</Grid>

Теперь в ваших двух пользовательских панелях управления навигация просто: -

Navigator.Navigate(new Uri("/SearchPage.xaml?q=" + searchBox.Text, UriKind.Relative)); 

Редактировать

Чтобы создатьСвойства зависимостей добавляют это к вашему TopSearchBar классу: -

    public INavigate Navigator
    {
        get { return GetValue(NavigatorProperty) as INavigate; }
        set { SetValue(NavigatorProperty, value); }
    }


    public static readonly DependencyProperty NavigatorProperty =
        DependencyProperty.Register(
            "Navigator",
            typeof(INavigate),
            typeof(TopSearchBar),
            new PropertyMetadata(null));

Дублируйте это в вашем BottomFavoritesBar классе, но измените ссылку на TopSearchBar.

1 голос
/ 19 ноября 2010

Предлагаю заглянуть в Prism CAL Pattern

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

http://development -guides.silverbaylabs.org / Видео / Silverlight-Prism

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