2010-12-30 1 views
1

Ein benutzerdefiniertes Steuerelement in Silverlight mit drei TextBlock-Elementen mit den Namen "Links", "Mitte" und "Rechts" wird angenommen. Ich möchte das Steuerelement innerhalb eines Gitters platzieren, das drei Spalten hat, und ich möchte, dass die Position dieser Elemente identisch ist, als ob ich sie inline mit der Grid.Column = "x" -Syntax mit Grid.Row definiert hätte angefügte Eigenschaft, die auf dem benutzerdefinierten Steuerelement selbst festgelegt wird.Wie können Sie in einem Silverlight CustomControl Elemente dieses Steuerelements gemäß einem Grid, das das Steuerelement enthält, anordnen?

Oder wenn ich komplett offline bin, was ist der beste Weg, um ein ähnliches Ergebnis zu erzielen.

+0

Sie müssen zuerst definieren, warum Sie denken, dass Sie eine Anforderung für ein benutzerdefiniertes Steuerelement überhaupt haben? – AnthonyWJones

+0

Ich hätte von Anfang an mit konkreten Beispielen gehen sollen. Hier sind zwei: 1. Drittanbieter stellen uns Steuerelemente zur Verfügung, die wir dann über MEF laden und in einem Gird-Layout platzieren, und wir möchten, dass die von ihnen definierten Elemente Spalten enthalten, die dem Host entsprechen. 2. Ein Steuerelement [Label - TextBox - DescriptionViewer], das an eine Entity-Eigenschaft bindet. Wir werden Hunderte von diesen schreiben und wollen, dass sie durchgängig konsistent sind. Auch die XAML-Syntax mit diesem Ansatz ist für mich viel besser lesbar. –

Antwort

1

Ich denke, es ist wahrscheinlich, dass Sie Weg "von der Basis" sind. Der Zweck eines benutzerdefinierten Steuerelements besteht darin, Daten auf einzigartige Weise darzustellen. Wenn Sie das Layout an ein externes Raster verteilen möchten, würde ich vorschlagen, dass Sie keinen Aufruf für ein benutzerdefiniertes Steuerelement haben.

Es scheint wahrscheinlicher, dass Sie eine Klasse mit drei Eigenschaften wünschen, an die Sie einfach drei TextBlocks binden. Ohne weitere Einzelheiten ist es schwer, bessere Ratschläge zu geben.

Um Ihre eigentliche Frage zu beantworten, können Sie nicht. Sie müssten einzelne Elemente direkt zur Children-Auflistung des Rasters hinzufügen, damit das Raster das Layout übernehmen kann. Dies bedeutet, dass diese Elemente nicht als untergeordnete visuelle Elemente in Ihrem benutzerdefinierten Steuerelement angezeigt werden können.

0

Mein erster Gedanke war, dass Sie offline sind :) aber Sie müssen einen guten Grund haben, diese Lösung zu suchen.

In Ihrem CustomControl überschreiben Sie OnApplyTemplate. In dieser Methode können Sie die drei TextBlocks finden und den Grid.Column-Wert mit SetValue festlegen.

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    /// Find TextBlock named "Left" 
    var left = GetTemplateChild("Left") as TextBlock; 
    left.SetValue(Grid.ColumnProperty, 0); 

    ... 
} 
+0

Das wird einfach nicht funktionieren. Der TextBlock ist kein Mitglied der Grid Children-Sammlung und wird daher nicht vom Grid ausgelegt. – AnthonyWJones

+0

Ich bin neu in SO - ich habe versucht, diese und darüber zu akzeptieren. Technisch gesehen, ist dies mit XAML unmöglich, obwohl ich denke, dass es ein Fehler ist, da dieser bei richtiger Anwendung stark sein könnte. Der beste Weg, um diesen Effekt zu erzielen, ist wahrscheinlich so etwas wie diese Antwort, aber ich denke, es wäre ein wenig komplizierter - das Layout-Element übergeben, von dem Sie Anregungen erhalten möchten, und dann auf diese Element-Layout-Ereignisse reagieren. Danke für die Antworten. –

Verwandte Themen