Silverlight:在每个页面上显示相同的控件
我正在构建一个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>
然后,我会改变框架内的页面,留下持久性元素到位。这是正确的方法,还是有其他一些首选模式?
但是,如果我这样做,我不知道如何让TopSearchBar
和BottomFavoritesBar
用户控件做导航。 (一般情况下,我不知道如何直接从UserControl
做导航。)
当TopSearchBar
是每个页面中的一员,我必须在每一页上的代码隐藏验证码:
topSearchBar.ParentPage = this;
TopSearchBar
然后可以使用此引用做导航:
ParentPage.NavigationService.Navigate(new Uri("/SearchPage.xaml?q=" + searchBox.Text, UriKind.Relative));
有没有更好的方式来做到这一点?这感觉有点尴尬。如果导航需要参考页面,我如何从NavFrame
传递该参考?
适当的方法是将依赖项属性添加到TopSearchBar
和BottomFavoritesBar
称为“导航器”(或任何你喜欢的),类型为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
。
我建议寻找到棱镜CAL模式
这样,你可以为你的容器创建的区域,你想从一个页面变为页的区域(一个或多个)......这很简单,你只要将新一在其他人留下的情况下替换旧的。在我看来,这是一种更简化的方法。
http://development-guides.silverbaylabs.org/Video/Silverlight-Prism
特别是在Region对象上查找一个View注入或创建复合视图... PRISM4手册有很好的解释如何去做。 – 2010-11-19 17:47:53
你能告诉你如何使用依赖属性来做到这一点吗?我不确定他们到底是什么,或者你为什么需要他们。 – 2010-11-20 17:46:30
@Rosarch:查看我的编辑。 – AnthonyWJones 2010-11-21 14:08:03
不错!这很好。你能解释为什么我需要一个依赖属性,而不仅仅是一个正常的CLR属性吗? – 2010-11-22 15:02:58