2010-01-05 8 views
2

J'ai créé le contrôle WPF le plus simple possible - Il remplace juste OnRender et dessine un rectangle rouge.Simple WPF Custom Control - Comment configurer la couleur de fond?

Toutefois, uniquement lorsque vous réglez l'arrière-plan en mode XAML sur bleu, le contrôle est entièrement bleu sans affichage rouge. Si l'arrière-plan n'est pas défini, le rectangle rouge ne montre aucun problème.

Pourquoi le rectangle rouge n'est pas affiché sur l'arrière-plan bleu lorsque l'arrière-plan est défini?

public class MyWpfControl : Control 
{ 
    protected override void OnRender(DrawingContext drawingContext) 
    { 
     drawingContext.DrawRectangle(Brushes.Red, null, new Rect(0, 0, 100, 100)); 
    } 
} 
+0

Vous pourriez être mieux d'écrire un contrôle utilisateur et faire tout cela en XAML – Daniel

+0

supprimé Tag Silverlight, Silverlight ' Control' n'a pas de OnRender. Cette question est à propos de wpf pas silverlight, c'est une question rare qui est pertinente pour les deux. – AnthonyWJones

+0

@Daniel: Je souhaite que je pourrais - malheureusement le contrôle doit Taille automatique du texte pour être aussi grand que s'adaptera, et cela nécessite du code et ne peut pas être fait dans le seul XAML. Le problème exact est ici: http://stackoverflow.com/questions/1990624/wpf-xaml-can-text-be-auto-sized – Lee

Répondre

1

Parce que OnRender se fait d'abord, puis l'arrière-plan est rendu - sauf si vous écrivez un très contrôle des performances à forte intensité, vous n'avez pas besoin de passer outre OnRender jamais.

Jetez un coup d'œil au livre d'Adam Nathan "WPF Unleashed", qui vous permettra de commencer à rédiger des commandes et de vous familiariser avec WPF. Laissez vos connaissances Winforms à la porte, les choses sont très différent, c'est une façon de penser séparée de l'approche Winforms/Win32.

+0

Cool merci - Y at-il un endroit en ligne qui documente ce comportement? MSDN, des articles, des blogs ou quelque part dans le livre WPF Unleashed? Si vous pouvez me donner un lien ou un numéro de page, je vais marquer la bonne réponse. Ne pas essayer d'être un imbécile, mais c'est tellement contre-intuitif que j'ai besoin de le vérifier et je regarderai avec plaisir n'importe où vous le dites. Merci encore - – Lee

+0

Quelle vérification avez-vous besoin de plus, vous avez la preuve ici! OnRender est appelé en premier, puis écrasé par le rendu pour l'arrière-plan. OnRender est * très * bas niveau dans WPF - il saute une grande partie de la magie de mise en page et de transformation que WPF fournit et n'est pas censé être utilisé souvent –

+0

Je vais prendre votre réponse pour signifier que vous croyez fortement que c'est comme ça que ça fonctionne , mais ne connaissent pas de sources corroborantes. Encore une fois la raison pour laquelle je suis sceptique est parce que s'il n'y avait aucun moyen d'utiliser la propriété Background et OnRender en même temps cela semblerait impliquer que personne ne pourrait jamais utiliser OnRender, et il est difficile de croire qu'aucun des contrôles existants utilisent il (Contexte fonctionne bien pour eux). – Lee

1

Je ne sais pas comment vous avez eu le problème. Voici une application simple qui utilise MyWpfControl et fonctionne très bien. Espérons que cela sera utile même si le problème ne peut pas être reproduit. Bonne chance.

Le code dans xaml.

<Window x:Class="MyWpfControlDemo.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <UserControl Content="{Binding WPFControl}"/> 
    </Grid> 
</Window> 
+0

Ping merci de votre réponse, cependant mon exemple est un "WPF Custom Control", et votre échantillon est un "WPF User Control", c'est pourquoi ce n'est pas la même chose. Cordialement - – Lee

0

vous retirez la mise en rouge de fond et de la méthode redéfinie OnRender ajouter ceci:

drawingContext.DrawRectangle(Brushes.Red,null,new Rect(new Point(0,0),this.RenderSize)); // background