Pertanyaan Mengikat properti Konten dari ContentControl di WinRT


Katakanlah saya memiliki aplikasi Windows Store (penargetan Windows 8.1), dan pada halaman ada ContentControl yang terlihat seperti ini:

<ContentControl>
  <ContentControl.Content>
    <TextBlock>Hello world</TextBlock>
  </ContentControl.Content>
</ContentControl>

Ini berfungsi dengan sangat baik, tetapi jika saya mencoba untuk mengatur konten sebagai sumber daya, seperti ini:

<Page.Resources>
  <TextBlock x:Key="TestContent">Hello world</TextBlock>
</Page.Resources>
<ContentControl Content="{StaticResource TestContent}" />

Semuanya tampak hebat di perancang, tetapi saya mendapatkan kesalahan berikut saat waktu proses:

Gagal menetapkan ke properti   'Windows.UI.Xaml.Controls.ContentControl.Content'

Saya sudah mencoba mendefinisikan sumber daya di berbagai tempat (app.xaml, file sumber daya terpisah, dll.) Tetapi saya mendapatkan kesalahan yang sama setiap kali.

Jadi, saya punya beberapa pertanyaan:

  1. Apakah ini mungkin dalam WinRT XAML? Apakah saya hanya melakukan sesuatu yang bodoh?
  2. Adakah cara lain untuk sumber konten sewenang-wenang seperti ini, mis. data jalur? (Saya memiliki beberapa keberhasilan terbatas dengan menentukan gaya untuk elemen Path, mengkonfigurasi data jalur di setter, tetapi tampaknya tidak kembali mengikat ketika menavigasi kembali ke halaman. Itu masalah lain meskipun ...)

6
2018-01-30 15:02


asal


Jawaban:


Biasanya, sumber daya adalah "contoh tunggal" bersama dan berbagai elemen XAML mengacu pada satu instance bersama. Saya tidak yakin mengapa Perancang menyiratkan ini akan berhasil (selain dari warisan dalam mendukung beberapa jenis "XAML"). Dalam kasus a TextBlock meskipun, itu sedikit berbeda karena Anda ingin instance Elemen dapat direplikasi dan dipakai beberapa kali (berpotensi dihosting dalam beberapa ContentControls misalnya).

WPF memiliki fitur untuk membuat karya ini, dalam atribut khusus yang disebut x:Shared. Anda akan mengaturnya false untuk menunjukkan bahwa a Resource tidak dibagikan dan setiap permintaan untuk sumber daya harus mengembalikan instance baru. WinRT tidak memiliki fitur yang sama ini.

Namun ada pekerjaan yang didukung sepenuhnya yang mungkin Anda pertimbangkan.

Salah satu pilihan adalah menggunakan Kerangka alih-alih mengganti konten secara langsung seperti yang Anda coba:

<Page.Resources>
    <Style x:Name="replacement" TargetType="ContentControl">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ContentControl">
                    <TextBlock FontSize="100" Foreground="Red">Hello!</TextBlock>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ContentControl Style="{StaticResource replacement}"></ContentControl>
</Grid>

Secara sintaksis, itu sedikit lebih lama tentu saja, tetapi secara fungsional, itu harus menjadi hasil yang sama.

Tanpa x:Shared, Anda terbatas untuk dapat mengikat sumber daya yang merupakan tipe data intrinsik, seperti x:string (seperti contoh di bawah ini):

<Page.Resources>
    <x:String x:Key="tbResource">The Text!</x:String>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" >
    <ContentControl Content="{StaticResource tbResource}" ></ContentControl>
</Grid>

6
2018-01-30 16:21



Asumsi saya adalah bahwa Anda menggunakan Visual Studio 2012. Ada kesalahan lain seperti pada tahun 2012 yang diselesaikan dalam Visual Studio 2013. Kode Anda, yang sempurna, berfungsi dengan baik di Visual Studio 2013.

enter image description here

Semoga berhasil!


0
2018-01-30 15:14