2010-11-02 22 views
11

Estamos migrando a Winforms a una solución basada en WPF. Tenemos una definición XML personalizada que se utiliza para crear el formulario de Windows en tiempo de ejecución.Cargando XAML XML a través del tiempo de ejecución?

Dado que XAML está basado en XML, ¿podemos definir un archivo HelloWorldWindow.xml con definición XAML y se puede cargar en la aplicación WPF sin ningún código detrás de los archivos CSharp? Adjuntaremos el código detrás del enlace en tiempo de ejecución.

¿Cómo adjuntar el código en tiempo de ejecución?

+0

Este es un archivo xml del que está hablando en realidad es una X válida ¿Archivo AML? –

+0

@Steve, sí, es un archivo xaml válido. Pero queremos que la implementación del código se adjunte en tiempo de ejecución. –

+0

Tienes una solución de trabajo de la aplicación de la mayor parte de los conceptos MVVM: [Mi Solución] [1] [1]: http://stackoverflow.com/questions/9021677/loading-xaml-at-runtime-using- the-mvvm-pattern-in-wpf/9033544 # 9033544 –

Respuesta

18

crear un archivo XML Tempwin.xml usar este XAML

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="300" Width="300" Background="Transparent" > 
<Border Background="Black" CornerRadius="10" BorderThickness="4" BorderBrush="RoyalBlue"> 
<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <TextBlock Text="Sample Text" Foreground="White" Margin="2"></TextBlock> 
     <TextBox Grid.Row="1" Margin="5"> </TextBox> 
     <TextBlock Text="Sample Text 1" Grid.Row="2" Foreground="White" Margin="2"></TextBlock> 
     <TextBox Grid.Row="3" Margin="5"></TextBox> 
     <Ellipse Fill="Red" Height="100" Width="100" Grid.Row="4" Margin="0,10,0,0"></Ellipse> 
    </Grid> 
    </Border> 

Crea una sa Aplicación MPLE WPF con el xaml continuación

<Window x:Class="WpfApplication12.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="600" Width="600"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition/> 

    </Grid.RowDefinitions> 

    <Button Height="25" Width="100" Margin="2" Click="Button_Click"> Show Content</Button> 
    <Grid x:Name="content" Grid.Row="1" Margin="2"> 

    </Grid> 
</Grid> 

Pegar el siguiente código C# en el código subyacente del Button_Click

StreamReader mysr = new StreamReader(@"D:\Tempwin.xml"); 
     FrameworkElement rootObject = XamlReader.Load(mysr.BaseStream) as FrameworkElement; 
     content.Children.Add(rootObject); 

si desea cargar xaml en tiempo de ejecución no se puede dar ningún código detrás de su XAML archivo. Así que me he quitado el atributo x: Class antes de crear el xml

Eventos El enganchar ....

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="300" Width="300" Background="Transparent" > 
<Border Background="Black" CornerRadius="10" BorderThickness="4" BorderBrush="RoyalBlue"> 
<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <TextBlock Text="Sample Text" Foreground="White" Margin="2"></TextBlock> 
     <TextBox Grid.Row="1" Margin="5"> </TextBox> 
     <TextBlock Text="Sample Text 1" Grid.Row="2" Foreground="White" Margin="2"></TextBlock> 
     <TextBox Grid.Row="3" Margin="5"></TextBox> 
     <Ellipse Fill="Red" Height="100" Width="100" Grid.Row="4" Margin="0,10,0,0"></Ellipse> 
     <Button Grid.Row="5" Height="25" Content="Event added at Runtime" x:Name="btnTest"></Button> 
    </Grid> 
    </Border> 

Button ButtoninXAML; 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 

     StreamReader mysr = new StreamReader(@"D:\Tempwin.xml"); 
     FrameworkElement rootObject = XamlReader.Load(mysr.BaseStream) as FrameworkElement; 
     ButtoninXAML = LogicalTreeHelper.FindLogicalNode(rootObject, "btnTest") as Button; 
     ButtoninXAML.Click += new RoutedEventHandler(Button_Click1); 

     content.Children.Add(rootObject); 

    } 
    private void Button_Click1(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("Added At Runtime"); 
    } 
4

Puede mostrar dinámicamente Xaml así:

string text = @"<TextBlock Text='test' xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' />"; 

    // Convert to stream 
    // You can also just stream the xaml from a file, using a FileStream 
    MemoryStream stream = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(text)); 

    // Convert to object 
    TextBlock block = (TextBlock)System.Windows.Markup.XamlReader.Load(stream); 

    //... now you can put that TextBlock somewhere, for example in your main Window 

Consulte la clase XamlReader para más información: http://msdn.microsoft.com/en-us/library/ms613427%28v=VS.95%29.aspx

1

he hecho cargar XAML en tiempo de ejecución, aquí es una ejemplo corto

Grid grd = new Grid(); 
var grdEncoding = new ASCIIEncoding(); 
var grdBytes = grdEncoding.GetBytes(myXAML); 
grd = (Grid)XamlReader.Load(new MemoryStream(grdBytes)); 
Grid.SetColumn(grd, 0); 
Grid.SetRow(grd, 0); 
parentGrid.Children.Add(grd); 

private String myXAML = @" <Grid xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' Margin='30 10 30 65' VerticalAlignment='Bottom'>" + 
       "<Label Content='Date: 1-Feb-2013' FontFamily='Arial' FontSize='12' Foreground='#666666' HorizontalAlignment='Left'/>" + 
       "<Label Content='4' FontFamily='Arial' FontSize='12' Foreground='#666666' HorizontalAlignment='Center'/>" + 
       "<Label Content='Hello World' FontFamily='Arial' FontSize='12' Foreground='#666666' HorizontalAlignment='Right'/>" + 
      "</Grid>"; 
Cuestiones relacionadas