2010-11-01 11 views
2

J'ai essayé de convertir le code XAML suivant en C#, mais sans succès. Je suis un peu coincé à la partie ControlTemplate. Je suis très nouveau à WPF, donc je peux faire tout faux. L'idée sous-jacente est que je dois extraire des données d'une base de données et envelopper chaque enregistrement avec le modèle ci-dessous. Étant donné que les lignes peuvent varier dans le montant que je veux générer chaque modèle en utilisant le code C#.Code XAML en C#

Je n'ai pas encore défini tous les attributs de contrôle.

   <Grid> 
       <Button Content="Button" Height="30" Name="button1" Margin="8,8,7,8" Click="button1_Click" > 
        <Button.Template> 
         <ControlTemplate> 
          <Rectangle RadiusX="5" RadiusY="5" Stroke="LightYellow" StrokeThickness="0.5" Name="myRectangle"> 
           <Rectangle.Fill> 
            <VisualBrush Opacity="0.7"> 
             <VisualBrush.Visual> 
              <TextBlock Name="myTextBlock" Foreground="LightYellow" Background="DarkBlue" Text="Text here" /> 
             </VisualBrush.Visual> 
            </VisualBrush> 
           </Rectangle.Fill> 
          </Rectangle> 
         </ControlTemplate> 
        </Button.Template> 
       </Button> 
      </Grid> 

Mon code C# jusqu'à présent:

Grid grid = new Grid(); 
     Button button = new Button(); 
     ControlTemplate controlTemplate = new ControlTemplate(); 
     Rectangle rectangle = new Rectangle(); 
     VisualBrush visualBrush = new VisualBrush(); 
     TextBlock textBlock = new TextBlock(); 
     textBlock.Text = "Text here"; 
     textBlock.Background = new SolidColorBrush(Color.FromRgb(2, 33, 233)); 

     visualBrush.Visual = textBlock; 
     visualBrush.Opacity = 0.7; 
     rectangle.Fill = visualBrush; 

     controlTemplate //What to do here? 

     button.Template = controlTemplate; 
     button.Content = "Button"; 
     button.Height = 30; 
     button.Width = 100; 
     grid.Children.Add(button); 
     this.Content = grid; 

Merci à l'avance,

Grant

+5

Vous pourriez vouloir repenser cette idée :-). Utilisez plutôt votre XAML dans un DataTemplate et appliquez-le à un ListBox ou ItemsControl avec vos lignes de base de données en tant que ItemsSource. Le faire par code C# codé à la main est comme construire une vraie maison en utilisant des briques LEGO :-) – Goblin

+0

Beau commentaire (+1). Presque je me sens mal pour traduire le xaml à coder derrière :-) –

+0

Merci, j'ai décidé de travailler sur l'idée de Goblin. Et ça a bien marché! – Supercell

Répondre

2

Ce code devrait être derrière équivalent à votre XAML.
Lors de la conversion de Xaml en code, il est presque plus facile de travailler à l'envers, en commençant par TextBlock dans ce cas, puis de progresser.

TextBlock textBlock = new TextBlock(); 
textBlock.Name = "myTextBlock"; 
textBlock.Foreground = Brushes.LightYellow; 
textBlock.Background = Brushes.DarkBlue; 
textBlock.Text = "Text here"; 

VisualBrush visualBrush = new VisualBrush(); 
visualBrush.Opacity = 0.7; 
visualBrush.Visual = textBlock; 

FrameworkElementFactory rectangle = new FrameworkElementFactory(typeof(Rectangle)); 
rectangle.SetValue(Rectangle.RadiusXProperty, 5.0); 
rectangle.SetValue(Rectangle.RadiusYProperty, 5.0); 
rectangle.SetValue(Rectangle.StrokeProperty, Brushes.LightYellow); 
rectangle.SetValue(Rectangle.StrokeThicknessProperty, 0.5); 
rectangle.SetValue(Rectangle.NameProperty, "myRectangle"); 
rectangle.SetValue(Rectangle.FillProperty, visualBrush); 

ControlTemplate controlTemplate = new ControlTemplate(); 
controlTemplate.VisualTree = rectangle; 

Button button = new Button(); 
button.Content = "Button"; 
button.Height = 30; 
button.Name = "button1"; 
button.Margin = new Thickness(8, 8, 7, 8); 
button.Click += new RoutedEventHandler(button_Click); 
button.Template = controlTemplate; 

Grid grid = new Grid(); 
grid.Children.Add(button); 
+0

Merci à vous deux. – Supercell