2014-01-30 11 views
6

Lassen Sie uns sagen, dass ich einen Windows Store App haben (Targeting von Windows 8.1), und auf einer Seite gibt es einen Content, die wie folgt aussieht:Binden der Content-Eigenschaft eines Content in WinRT

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

Diese absolut einwandfrei funktioniert, aber wenn ich versuche, den Inhalt einzurichten als eine Ressource, wie folgt aus:

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

Alles sieht gut aus in dem Designer, aber ich bekomme die folgende Fehlermeldung zur Laufzeit:

fehlgeschlagen Eigenschaft ‚Windows.UI.Xaml.Controls.ContentControl.Content‘

Ich habe versucht, die Definition die Ressource in verschiedenen Orten (app.xaml, separate Ressource-Dateien, etc.) zugewiesen werden, aber Ich bekomme jedes Mal denselben Fehler.

Also, ich habe einige Fragen:

  1. Sollte dies in WinRT XAML möglich sein? Mache ich gerade etwas Dummes?
  2. Gibt es eine andere Möglichkeit, willkürlichen Inhalt wie diesen, z. Pfaddaten? (Ich hatte einen begrenzten Erfolg, indem ich einen Stil für ein Path-Element definierte, die Pfaddaten in einem Setter konfigurierte, aber es scheint nicht neu zu binden, wenn ich zu einer Seite zurück navigiere. Das ist ein ganz anderes Problem ...)

Antwort

6

Normalerweise ist eine Ressource eine gemeinsam genutzte "Einzelinstanz" und verschiedene XAML-Elemente beziehen sich auf die einzelne gemeinsame Instanz. Ich bin mir nicht sicher, warum der Designer impliziert, dass dies funktionieren würde (abgesehen von seiner Unterstützung bei der Unterstützung mehrerer Arten von "XAML"). Im Fall einer TextBlock ist dies jedoch etwas anders, da die Element-Instanz mehrfach repliziert und instanziiert werden könnte (z. B. wenn sie in mehreren ContentControl s gehostet wird).

WPF hatte eine Funktion, die dies ermöglicht, in einem speziellen Attribut namens x:Shared. Sie würden dies auf false setzen, um anzuzeigen, dass eine Resource nicht freigegeben wurde und dass jede Anforderung für die Ressource eine neue Instanz zurückgeben sollte. WinRT verfügt nicht über dieselbe Funktion.

Es gibt jedoch einen vollständig unterstützten Work-around, den Sie in Betracht ziehen könnten.

Eine Möglichkeit wäre, eine Vorlage zu verwenden, anstatt den Inhalt zu ersetzen, direkt, wie Sie versucht haben:

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

syntaktisch, es ist ein wenig länger natürlich, aber funktionell, sollte es die gleichen Ergebnisse sein.

Ohne die x:Shared, sind Sie in der Lage, beschränkt auf Ressourcen zu binden, die die intrinsischen Datentypen sind, wie x:string (wie das Beispiel unten Werke):

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

Bingo! Hervorragende Erklärung und alternative Lösung - vielen Dank. –

0

Meine Vermutung ist, dass Sie Visual Studio 2012. Es gab noch andere solche Fehler im Jahr 2012 verwenden, die in Visual Studio 2013 Ihr Code aufgelöst wurden, die perfekt ist, funktioniert in Visual Studio 2013

enter image description here

Viel Glück!

+0

Dank Jerry - nee, sorry ich m in VS 2013 (Ich ziele auf Windows 8.1, was es erfordert, denke ich) - alles scheint gut zu funktionieren im Designer, es ist nur zur Laufzeit bekomme ich den Fehler –

+0

Es ist eigentlich ein Fehler, der der Designer schlägt vor, dass der Code würde funktionieren. Meine Antwort hat mehr Details, wenn Sie interessiert sind. – WiredPrairie

Verwandte Themen