2010-11-19 84 views
2

我正在构建一个SL4应用程序。我有两个控件,一个顶部搜索栏和一个底部收藏夹栏,我希望每个页面都有一个。我不确定要做到这一点的最佳方法是什么。Silverlight:在每个页面上显示相同的控件

我的当前方法使用一个导航帧作为根视觉:

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> 

然后,我会改变框架内的页面,留下持久性元素到位。这是正确的方法,还是有其他一些首选模式?

但是,如果我这样做,我不知道如何让TopSearchBarBottomFavoritesBar用户控件做导航。 (一般情况下,我不知道如何直接从UserControl做导航。)

TopSearchBar是每个页面中的一员,我必须在每一页上的代码隐藏验证码:

topSearchBar.ParentPage = this; 

TopSearchBar然后可以使用此引用做导航:

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

有没有更好的方式来做到这一点?这感觉有点尴尬。如果导航需要参考页面,我如何从NavFrame传递该参考?

回答

2

适当的方法是将依赖项属性添加到TopSearchBarBottomFavoritesBar称为“导航器”(或任何你喜欢的),类型为INavigate

XAML中是这样的: -

<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

+0

你能告诉你如何使用依赖属性来做到这一点吗?我不确定他们到底是什么,或者你为什么需要他们。 – 2010-11-20 17:46:30

+0

@Rosarch:查看我的编辑。 – AnthonyWJones 2010-11-21 14:08:03

+0

不错!这很好。你能解释为什么我需要一个依赖属性,而不仅仅是一个正常的CLR属性吗? – 2010-11-22 15:02:58

1

我建议寻找到棱镜CAL模式

这样,你可以为你的容器创建的区域,你想从一个页面变为页的区域(一个或多个)......这很简单,你只要将新一在其他人留下的情况下替换旧的。在我看来,这是一种更简化的方法。

http://development-guides.silverbaylabs.org/Video/Silverlight-Prism

+0

特别是在Region对象上查找一个View注入或创建复合视图... PRISM4手册有很好的解释如何去做。 – 2010-11-19 17:47:53

相关问题