2010-12-10 16 views
3

Ich bin zugegebenermaßen neu in der WP7 App Entwicklungsszene. Ich hatte ein Video gefunden, das zeigt, wie man etwas Ähnliches vor einer Weile macht, aber es nicht mehr lokalisieren kann.Dynamische XAML durch C#

Im Wesentlichen möchte ich den Inhalt einer XAML-Seite basierend auf einer Auswahl durch den Benutzer ändern. Für ein einfaches Beispiel könnte es fünf Tasten mit der Nummer 1-5 geben. Klicken Sie auf das, was Sie so viele Textfelder auf einer Seite erstellen würden. Gibt es also eine Möglichkeit, den Button im Event-Handler anzuweisen, etwas XAML-Code in die Seite einzufügen? Funktioniert das ähnlich wie CSS-Blätter in HTML? Vielen Dank für Ihre Zeit und helfen Sie mir bei dieser Frage! Selbst wenn man mich auf ein Tutorial oder den Namen der Methode verweist, könnte ich Google helfen.

Antwort

1

Sie würden nicht wirklich in Ihre XAML-Datei "einfügen", Sie hätten C# -Code in Ihrem Button-Handler, um TextBox-Steuerelemente dynamisch zu einem in Ihrem XAML definierten Panel hinzuzufügen.

MainWindow.xaml

<phone:PhoneApplicationPage x:Class="WindowsPhoneApplication2.MainPage" 
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
          xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
          xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
          mc:Ignorable="d" 
          d:DesignWidth="480" 
          d:DesignHeight="768" 
          FontFamily="{StaticResource PhoneFontFamilyNormal}" 
          FontSize="{StaticResource PhoneFontSizeNormal}" 
          Foreground="{StaticResource PhoneForegroundBrush}" 
          SupportedOrientations="Portrait" 
          Orientation="Portrait" 
          shell:SystemTray.IsVisible="True"> 

    <!--LayoutRoot is the root grid where all page content is placed--> 
    <Grid x:Name="LayoutRoot" 
      Background="Transparent"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 

     <!--TitlePanel contains the name of the application and page title--> 
     <StackPanel x:Name="TitlePanel" 
        Grid.Row="0" 
        Margin="12,17,0,28"> 
      <TextBlock x:Name="ApplicationTitle" 
         Text="MY APPLICATION" 
         Style="{StaticResource PhoneTextNormalStyle}" /> 
      <TextBlock x:Name="PageTitle" 
         Text="page name" 
         Margin="9,-7,0,0" 
         Style="{StaticResource PhoneTextTitle1Style}" /> 
     </StackPanel> 

     <!--ContentPanel - place additional content here--> 
     <Grid x:Name="ContentPanel" 
       Grid.Row="1" 
       Margin="12,0,12,0"> 
      <StackPanel> 
       <Button Click="Button_Click" 
         Content="1" /> 
       <Button Click="Button_Click" 
         Content="2" /> 
       <Button Click="Button_Click" 
         Content="3" /> 
       <Button Click="Button_Click" 
         Content="4" /> 
       <Button Click="Button_Click" 
         Content="5" /> 
       <StackPanel x:Name="DynamicPanel"> 
       </StackPanel> 
      </StackPanel> 
     </Grid> 
    </Grid> 
</phone:PhoneApplicationPage> 

MainWindow.cs:

using System; 
using System.Windows; 
using System.Windows.Controls; 
using Microsoft.Phone.Controls; 

namespace WindowsPhoneApplication2 { 
    public partial class MainPage : PhoneApplicationPage { 
     // Constructor 
     public MainPage() { 
      InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) { 
      int numBoxes = Int32.Parse(((Button) sender).Content.ToString()); 
      DynamicPanel.Children.Clear(); 
      for (int i = 0; i < numBoxes; i++) { 
       var newTextBlock = new TextBlock { Name = "textBlock" + i.ToString(), Text = "Hello!" }; 
       DynamicPanel.Children.Add(newTextBlock); 
      } 
     } 
    } 
} 
+0

Ja, „Einfügen“ war sehr viel eine zu starke Vereinfachung des Prozesses. – Dan

+0

Siehe Beispiel oben – lesscode

+0

Anstatt einen dynamisch generierten Code einzufügen, möchte ich einen bestimmten von mir geschriebenen Code verwenden. Also, wenn ich In das nach Button-Klick-Ereignis einfügen wollte, wie würde ich das in der CodeBehind-Datei codieren? – Dan

0

Als Wayne es in vielen Fällen geradlinig weist darauf hin, Kontrollen zur Laufzeit in C# zu generieren.

Alternativ, wenn Sie in der Generierung von XAML zur Laufzeit sehen wollten, hier ist ein Beitrag von Pete Brown, die Ihnen den Anfang machen wird.

Dynamically Generating Controls in WPF and Silverlight