2010-11-19 22 views
2

Bir SL4 uygulaması yapıyorum. Her sayfada mevcut olmak istediğim iki kontrol, bir üst arama çubuğu ve bir alt favori çubuğu var. Bunu yapmanın en iyi yolunun ne olduğundan emin değilim.Silverlight: Her sayfada aynı kontrolleri göster

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> 

Benim geçerli bir yaklaşım, görsel kökü olarak bir gez çerçeve kullanır Sonra, Çerçeve içindeki sayfaları değiştirerek kalıcı olurum. elemanlar yerinde. Bu doğru yaklaşım mı yoksa tercih edilen başka bir model mi var?

Ancak, bunu yaparsam, TopSearchBar ve BottomFavoritesBar kullanıcı denetimlerinin gezinme işlemini nasıl yaptıklarından emin değilim. (Genel olarak, ben UserControl doğrudan navigasyonu nasıl emin değilim.) TopSearchBar her sayfanın bir üyesi iken

, ben her sayfanın kod arkada bu kodu olurdu:

topSearchBar.ParentPage = this; 
bunu yapmak için daha iyi bir yolu

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

var mı:

TopSearchBar sonra navigasyon yapmak için bu başvuruyu kullanabilir? Biraz garip geliyor. Gezinme bir sayfaya başvuru gerektiriyorsa, bu başvuruyu NavFrame'dan nasıl aktarabilirim?

cevap

2

Uygun yaklaşım, INavigate türüne sahip olan "Navigator" (ya da tercih ederseniz) adı verilenve BottomFavoritesBar için bağımlılık özelliği eklemektir.

Kişisel xaml şu şekilde görünecektir: - senin iki Bar kullanıcı denetimleri navigasyonda

Şimdi
<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> 

basitçe: -

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

Düzenleme

bağımlılık özelliklerini oluşturmak için Bunu TopSearchBar sınıfınıza ekleyin: -

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)); 

Bunu, BottomFavoritesBar sınıfınızda çoğaltın, ancak başvuruyu TopSearchBar olarak değiştirin. Ben Prizma CAL Kalıbı

senin konteynerler için diğer bölge oluşturabilir Bu şekilde ve sayfadan sayfaya değiştirildi istediğiniz bölge (ler) bakarak öneririz

+0

Bunu yapmak için Bağımlılık Özellikler 'nasıl kullanacağını gösterebilir misin? Tam olarak ne olduklarından emin değilim ya da neden onlara ihtiyacın var? –

+0

@Rosarch: Düzenlememe bakın. – AnthonyWJones

+0

güzel! Bu harika çalışıyor. Burada sadece bir CLR özelliği değil, Bağımlılık Özelliğine neden ihtiyaç duyduğumu açıklayabilir misiniz? –

1

... çok basit, sadece yenisini takas diğerleri yerlerinde iken eski olanı değiştirmek. Bu benim düşüncemde daha akıcı bir yaklaşım.

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

+0

Özellikle, Bölge görünümüne bir Enjeksiyon nesnesi mi arıyorsunuz yoksa kompozit görünüm oluştur ... PRISM4 kullanım kılavuzunun nasıl yapılacağı konusunda iyi bir açıklama vardır. –

İlgili konular