Pregunta Control de Estados con C# (Silverlight4)

  • miércoles, 19 de septiembre de 2012 4:19
     
      Tiene código

    Saludos, genere una aplicación Silverlight en Spression Blend 4, la cual consta de XAML y C#. Alguien me puede aportar una idea sobre como convertir el XAML a C#. Es decir, como declarar los estados con C#.

    XAML de la aplicacion:

    <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="HolaEstados.MainPage" Width="400" Height="202"> <!--Objeto Canvas.--> <Canvas x:Name="LayoutRoot" Background="#FFDAA93E" > <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="VisualStateGroup">

    <!--Estado Visual 1--> <VisualState x:Name="EstadoVisual1"> <Storyboard> <ColorAnimation Duration="0" To="#FF2121E9" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/> </Storyboard> </VisualState>

    <!--Estado Visual 2--> <VisualState x:Name="EstadoVisual2"> <Storyboard> <ColorAnimation Duration="0" To="#FFF7CE0D" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/> </Storyboard> </VisualState>

    <!--Estado Visual 3--> <VisualState x:Name="EstadoVisual3"> <Storyboard> <ColorAnimation Duration="0" To="#FFF13B12" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/> </Storyboard> </VisualState>

    </VisualStateGroup> </VisualStateManager.VisualStateGroups>

    <!--Objeto Button1.--> <Button Content="Estado1" Canvas.Left="8" Canvas.Top="68" Width="75" Click="eventoClick"/> <!--Objeto Button2.--> <Button Content="Estado3" Width="75" Canvas.Left="8" Canvas.Top="120" Click="eventoClick"/> <!--Objeto Button3.--> <Button Content="Estado2" Width="75" Canvas.Left="8" Canvas.Top="94" Click="eventoClick"/> <!--Objeto Rectangle.--> <Rectangle x:Name="rectangle" Fill="#FFF4F4F5" Height="125" Canvas.Left="223" Stroke="Black" Canvas.Top="68" Width="169"/> <!--Objeto TextBlock.--> <TextBlock Height="45" Width="384" Canvas.Left="8" Canvas.Top="8" TextWrapping="Wrap" FontSize="13.333" Text="Este ejemplo define un objeto Rectangle con 3 estados declarados con XAML, los cuales son invocados con C#." /> </Canvas> </UserControl>

    Codigo C# de la aplicacion:

    //Directivas using.
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    
    //Espacio de nombres.
    namespace HolaEstados
    {
    	//Clase parcial derivada de UserControl denominada MainPage.
    	public partial class MainPage : UserControl
    	{
    		//Constructor.
    		public MainPage()
    		{
    			// Necesario para inicializar variables
    			InitializeComponent();
    		}
    
    		//Metodo manejador de eventos.
    		//Detecta sobre que boton se pulsa y segun el boton asigna un estado.
            private void eventoClick(object sender, RoutedEventArgs e)
            {
                //Obtiene la referencia al objeto que produce el evento y la almacena en varButton.
                Button varButton = e.OriginalSource as Button;
    
                //Sentencia if (Boton: Estado1).
                if (varButton.Content.ToString() == "Estado1")
                {
                    //Establece el Estado1.
                    VisualStateManager.GoToState(this, "EstadoVisual1", true);
                }
                //Sentencia else if (Boton: Estado2).
                else if (varButton.Content.ToString() == "Estado2")
                {
                    //Establece el Estado2.
                    VisualStateManager.GoToState(this, "EstadoVisual2", true);
                }
                //Sentencia else if (Boton: Estado3).
                else if ((varButton.Content.ToString() == "Estado3"))
                {
                    //Establece el Estado3.
                    VisualStateManager.GoToState(this, "EstadoVisual3", true);
                }
            }
    	}
    }


    El siguiente enlace muestra la aplicación en Internet:

    http://dl.dropbox.com/u/106467475/HolaEstadosSite/Default.html

    Agregue algo de código pero no funciona ¿Por que no funciona?

    Por favor, que algún MVP ayude a este simple mortal.

    <UserControl
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    	xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    	mc:Ignorable="d"
    	x:Class="HolaEstados.MainPage"
    	Width="400" Height="202">
    
    	<!--Objeto Canvas.-->
    	<Canvas x:Name="LayoutRoot" Background="#FFDAA93E" >
    		<VisualStateManager.VisualStateGroups>
    			<VisualStateGroup x:Name="objetoVisualStateGroup">
                    
    				<!--Estado Visual 1-->
    				<VisualState x:Name="EstadoVisual1">
    					<!--Agregado mediante codigo.-->
    				</VisualState>
                    
    				<!--Estado Visual 2-->
    				<VisualState x:Name="EstadoVisual2">
    					<Storyboard>
    						<ColorAnimation Duration="0" 
                                            To="#FFF7CE0D" 
                                            Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" 
                                            Storyboard.TargetName="objetoRectangle1" 
                                            d:IsOptimized="True"/>
    					</Storyboard>
    				</VisualState>
                    
    				<!--Estado Visual 3-->
    				<VisualState x:Name="EstadoVisual3">
    					<Storyboard>
    						<ColorAnimation Duration="0" 
                                            To="#FFF13B12" 
                                            Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" 
                                            Storyboard.TargetName="objetoRectangle1" 
                                            d:IsOptimized="True"/>
    					</Storyboard>
    				</VisualState>
                    
    			</VisualStateGroup>
    		</VisualStateManager.VisualStateGroups>
            
    		<!--Objeto Button1.-->
    		<Button Content="Estado1" Canvas.Left="8" Canvas.Top="68" Width="75" Click="eventoClick"/>
    		<!--Objeto Button2.-->
            <Button Content="Estado3" Width="75" Canvas.Left="8" Canvas.Top="120" Click="eventoClick"/>
    		<!--Objeto Button3.-->
            <Button Content="Estado2" Width="75" Canvas.Left="8" Canvas.Top="94" Click="eventoClick"/>
    		<!--Objeto objetoRectangle1.-->
    		<Rectangle x:Name="objetoRectangle1" Fill="#FFF4F4F5" Height="125" Canvas.Left="223" Stroke="Black" Canvas.Top="68" Width="169"/>
    		<!--Objeto TextBlock.-->
    		<TextBlock Height="45" Width="384" Canvas.Left="8" Canvas.Top="8" TextWrapping="Wrap" FontSize="13.333" 
    		Text="Este ejemplo define un objeto objetoRectangle1 con 3 estados declarados con XAML, los cuales son invocados con C#." />
    	</Canvas>
    </UserControl>

    //Directivas using.
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    
    //Espacio de nombres.
    namespace HolaEstados
    {
    	//Clase parcial derivada de UserControl denominada MainPage.
    	public partial class MainPage : UserControl
    	{
    		//Constructor.
    		public MainPage()
    		{
    			// Necesario para inicializar variables
    			InitializeComponent();
    		}
    
    		//Metodo manejador de eventos.
    		//Detecta sobre que boton se pulsa y segun el boton asigna un estado.
            private void eventoClick(object sender, RoutedEventArgs e)
            {
                //Crea un objeto ColorAnimation.
                ColorAnimation objetoColorAnimation = new ColorAnimation();
                //Define la duracion de la animacion (0 Segundos).
                objetoColorAnimation.Duration = new Duration(TimeSpan.FromSeconds(0));
                //Establece el color que asigna el Estado1.
                objetoColorAnimation.To = Color.FromArgb(255, 254, 73, 0);
    
                //Define el numero de repeticiones de la escala de tiempo (Infinito).
                objetoColorAnimation.RepeatBehavior = RepeatBehavior.Forever;
                //Define si la escala de tiempo retrocede despues de completar una iteracion de avance.
                objetoColorAnimation.AutoReverse = false;
    
                //Crea un objeto Storyboard.
                Storyboard objetoStoryboard = new Storyboard();
                //Agrega el objetoColorAnimation al objetoStoryboard.
                objetoStoryboard.Children.Add(objetoColorAnimation);
                //Establece el objeto al cual se aplica la animacion.
                Storyboard.SetTarget(objetoColorAnimation, objetoRectangle1);
                //Establece el nombre de la propiedad de dependencia que se anima.
                Storyboard.SetTargetProperty(objetoColorAnimation, new PropertyPath(objetoRectangle1.Fill));
    
                //Agrega el objetoColorAnimation al EstadoVisual1.
                EstadoVisual1.Storyboard.Children.Add(objetoColorAnimation);
    
                //Obtiene la referencia al objeto que produce el evento y la almacena en varButton.
                Button varButton = e.OriginalSource as Button;
    
                //Sentencia if (Boton: Estado1).
                if (varButton.Content.ToString() == "Estado1")
                {
                    //Establece el Estado1.
                    VisualStateManager.GoToState(this, "EstadoVisual1", true);
                }
                //Sentencia else if (Boton: Estado2).
                else if (varButton.Content.ToString() == "Estado2")
                {
                    //Establece el Estado2.
                    VisualStateManager.GoToState(this, "EstadoVisual2", true);
                }
                //Sentencia else if (Boton: Estado3).
                else if ((varButton.Content.ToString() == "Estado3"))
                {
                    //Establece el Estado3.
                    VisualStateManager.GoToState(this, "EstadoVisual3", true);
                }
            }
    	}
    }






    • Editado MonsterCSharp miércoles, 19 de septiembre de 2012 20:49 Corregir Errores
    • Editado MonsterCSharp miércoles, 19 de septiembre de 2012 20:51
    • Editado MonsterCSharp miércoles, 19 de septiembre de 2012 20:52
    • Editado MonsterCSharp miércoles, 19 de septiembre de 2012 20:53
    • Editado MonsterCSharp miércoles, 19 de septiembre de 2012 20:53
    • Editado MonsterCSharp jueves, 20 de septiembre de 2012 4:53 Agregar informacion
    •  

Todas las respuestas

  • jueves, 27 de septiembre de 2012 15:48
     
     

    Me parece que tienes el mismo problema que esta persona, http://stackoverflow.com/questions/5696626/programmatic-state-changes-not-working-in-silverlight

    Saludos,

  • viernes, 28 de septiembre de 2012 1:13
     
     

    Lamentablemente no es la solución completa. Es decir, según leo esta persona quiere invocar los estados escritos en XAML con manejadores de eventos escritos en C#(Eso ya lo hice y muestro como hacerlo en el primer par de codigo). Yo lo que quiero es declarar los estados con C#. El como invocarlos es muy facil. Saludos y gracias por colaborar.

    Nota: Mi intención es que la pagina se descargue lo mas rápido posible y esto pretendo lograrlo declarando en C# tanto como me sea posible. Ah, y también pretendo agregar tantas consultas en el foro como pueda (Este mes no he tenido tiempo). Esto con la intención de popularizar el uso de Silverlight.
    • Editado MonsterCSharp viernes, 28 de septiembre de 2012 1:23
    •