none
Silverlight General FAQ(XAML): Apa yang dimaksud dengan namescope? RRS feed

  • Diskusi Umum

  • Dalam Silverlight, sebuah namescope XAML menyimpan hubungan antara XAML-defined names daro object dan instance mereka yang setara. Silakan merujuk ke: http://msdn.microsoft.com/en-us/library/cc189026(VS.95).aspx  untuk dokumen lengkap tentang namescope.

    Ingatlah beberapa hal berikut ketika anda menggunakan namescope:

    • Bila anda membuat objek baru dengan XamlReader.Load, sebuah namescope baru akan dibuat.

    Masalah umum yang dihadapi user yaitu mencoba untuk menggunakan Storyboard untuk menghidupkan objek yang dibuat secara dinamis.

    Bayangkan jika anda memiliki markup ini dalam UserControl:

    <UserControl.Resources>

        <Storyboard x:Name="sb">

                    <DoubleAnimation Storyboard.TargetName="btn" Storyboard.TargetProperty="Width" From="0" To="200"/>

        </Storyboard>

    </UserControl.Resources>

    Pada kode pemograman, buatlah sebuah Button bernama btn dengan XamlReader.Load:

    string xaml = @"<Button                                  xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""                                     xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""

             x:Name=""btn""/>";

    Button btn = (Button)XamlReader.Load(xaml);

    this.LayoutRoot.Children.Add(btn);

    this.sb.Begin();

    Hal ini akan menyebabkan sebuah exception yang menunjukkan TargetName dari Storyboard (btn) tidak dapat ditemukan. Dalam hal ini, Storyboard adalah namescope1. Button yang diciptakan oleh XamlReader.Load berada dalam namescope2. Storyboard tidak dapat menemukan btn dalam namescope1, sehingga exception akan dikeluarkan.

    Salah satu cara untuk memperbaiki masalah ini adalah dengan menghapus TargetName di markup DoubleAnimation, dan menetapkan target Storyboard dalam kode secara dinamis setelah Button dibuat. Hal ini dapat mengatasi masalah dalam namescope.

    Storyboard.SetTarget(this.sb.Children[0], btn);

    Solusi yang lebih baik bisa dilakukan dengan membuat sebuah reusable Storyboard dan meletakkan Storyboard tersebut pada UserControl. Lihat “Bagaimana cara membuat Storyboard dan menerapkannya pada beberapa elemen?<//span>” untuk informasi lebih lanjut.

    • Template (ControlTemplate dan DataTemplate) mendefinisikan namescopenya sendiri.

    Masalah yang biasa dihadapi user yaitu dalam kode pemograman, mereka tidak dapat menemukan elemen yang didefinisikan pada Template. Sebagai contoh:

    <Button x:Name="btn" >

             <Button.Template>

                       <ControlTemplate TargetType="Button">

                                <Rectangle x:Name="rect" Fill="Aqua"/>

                       </ControlTemplate>

             </Button.Template>

    </Button>

    Disini anda tidak akan menemukan Rectangle bernama rect secara langsung pada kode pemograman dengan this.rect. Bahkan dengan Rectangle rect = (Rectangle)this.btn.FindName("rect"); tidak akan berhasil.

    Untuk menemukan Rectangle, anda dapat menggunakan Loaded event of rect. Pada kode pemograman, anda bisa mendapatkan referensi untuk Rectangle melalui parameter pengirim:

    private Rectangle rect;

    private void rect_Loaded(object sender, RoutedEventArgs e)

    {

             this.rect = (Rectangle)sender;

    }


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Senin, 28 Mei 2012 09.26
    Moderator