none
UserControl, Content Eigenschaft einem Element vererben RRS feed

  • Frage

  • Hallo alle zusammen,

    ich bin gerade wieder einmal an meine grenzen gestoßen und hoffe ihr könnt mir bei meinem Problem helfen.

    Ich möchte mir ein UserControl erstellen und diesem per XAML weiteren Content zuordnen genau wie man es mit einem Button machen kann á la:

    <Button> <!--dieses hier meine ich--> <StackPanel> <TextBox/> <Image/> </StackPanel>

    <!-- --> </Button>

    Dieser Content soll dann innerhalb meines UserControls angezeigt werden.

    Um noch genauer zu werden. Ich möchte ein Spoiler Objekt machen welches sich bei klick ausweitet und seinen Inhalt preis gibt. Jedoch möchte ich den Inhalt per XAML wie oben am Button demonstriert einfügen und nicht jedes mal ein neues UserControl mit jeweiligem inhalt erstellen. 

    Wie geht das?

    Patrik.


    • Bearbeitet Partik Samstag, 24. August 2013 14:40
    Samstag, 24. August 2013 14:14

Antworten

  • Hallo, dafür musst du nur der Klasse über ein Attribut sagen, welche Eigenschaft der Inhalt ist. Das geht über das ContentProperty-Attribut. Ein Beispil dazu in C#:
        [ContentProperty(Name="MyContent")]
        public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }
    
    
            public object MyContent
            {
                get { return (object)GetValue(MyContentProperty); }
                set { SetValue(MyContentProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for MyContent.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty MyContentProperty =
                DependencyProperty.Register("MyContent", typeof(object), typeof(UserControl1), new PropertyMetadata(null));        
        }

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Partik Montag, 26. August 2013 15:54
    Samstag, 24. August 2013 17:15

Alle Antworten

  • Hallo, dafür musst du nur der Klasse über ein Attribut sagen, welche Eigenschaft der Inhalt ist. Das geht über das ContentProperty-Attribut. Ein Beispil dazu in C#:
        [ContentProperty(Name="MyContent")]
        public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }
    
    
            public object MyContent
            {
                get { return (object)GetValue(MyContentProperty); }
                set { SetValue(MyContentProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for MyContent.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty MyContentProperty =
                DependencyProperty.Register("MyContent", typeof(object), typeof(UserControl1), new PropertyMetadata(null));        
        }

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Partik Montag, 26. August 2013 15:54
    Samstag, 24. August 2013 17:15
  • Danke für die Antwort!

    Ich habe das einfach mal so übernommen und bekomme eine Fehlermeldung mit der ich nichts anzufangen weis:

    Fehler 2 "Windows.UI.Xaml.Controls.UserControl.ContentProperty" ist ein(e) "Eigenschaft", wird aber wie ein(e) "Typ" verwendet. C:\Users\Patrik\Documents\Visual Studio 2012\Projects\LEDcontroller\LEDcontroller\Spoiler.xaml.cs 19 6 LEDcontroller

    namespace LEDcontroller
    {
        [ContentProperty(Name = "SpoilerContent")]
        public sealed partial class Spoiler : UserControl
        {
            public Spoiler()
            {
                this.InitializeComponent();
            }
    
            public object SpoilerContent
            {
                get { return (object)GetValue(MyContentProperty); }
                set { SetValue(MyContentProperty, value); }
            }
            // Using a DependencyProperty as the backing store for MyContent.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty MyContentProperty = DependencyProperty.Register("SpoilerContent", typeof(object), typeof(Spoiler), new PropertyMetadata(null));
        }
    }

    Sonntag, 25. August 2013 14:24
  • Das UserControl hat bereits eine vorgefertrigte Content-Eigenschaft und eine ContentProperty-Eigenschaft. Damit die Attributklasse ContentProperty auch als Klasse gefunden wird, musst du noch den Namespace System.UI.Xaml.Markup hinzufügen:
    using Windows.UI.Xaml.Markup;


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 25. August 2013 14:35
  • Dankeschön! Funktionier!
    Montag, 26. August 2013 15:54