none
Donde estoy fallando con estas Propiedades de Dependencia RRS feed

  • Pregunta

  • Hola muchachos saludos ante todo y por favor espero de Corazón que me puedan ayudar, este pequeño problema  me servirá para solucionar algo mayor, veamos:

    Tengo un control de usuario en el cual dibujo una pequeña línea horizontal que emula al Eje X

    Y debajo de  él, dibujo sus numeritos, algo simple.

    Al tratar de cambiar los atributos de ese Control, vía XAML desde la ventana principal, NO logro que se actualice el grafico y se muestre con los nuevos valores, algo pero NO sé que es está fallando en mis Propiedades de Dependencia, por favor échenme una mano se los agradeceré.

    El código está muy legible solo tengan un poquito de paciencia por favor.

    <UserControl x:Class="WpfPruebaUserControl.UserControl_EjeX"

                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

                 mc:Ignorable="d"

                 d:DesignHeight="300" d:DesignWidth="400">

       

        <Viewbox Stretch="Fill">

            <Canvas Height="200" Width="400" Margin="2" Name="CanvasAreaDibujo" >

                <Canvas.Background>

                    <LinearGradientBrush  StartPoint="0,0" EndPoint="0,1">

                        <GradientStop Color="#00a1e4" Offset="0.5"/>

                        <GradientStop Color="#0051b2" Offset="1"/>

                    </LinearGradientBrush>

                </Canvas.Background>

            </Canvas>

        </Viewbox>

    </UserControl>

     

    public partial class UserControl_EjeX : UserControl

        {

            double aNroDivX = 10d; // Representa el total de divisiones (marquitas) en el eje X

            double aSepMarcasX; // Representa el espacio o separacion entre marca y marca,tambien entre numero y numero

            double aGrosorLinea = 2d; //Representa el grosor de la linea del eje X

            Brush  aColorNumeros = new SolidColorBrush(Color.FromRgb(238, 201, 0));

     

            public UserControl_EjeX()

            {

                InitializeComponent();

     

                DibujarEjeX (CanvasAreaDibujo);

            }

     

            /* ****************************************** Logica De La Aplicacion ****************************************** */

     

            public void DibujarEjeX(Canvas MyCanvas)

            {

                Line EjeX = new Line() //Dibujamos el eje X

                {

                    Stroke = new SolidColorBrush(Colors.Navy),

                    StrokeThickness = aGrosorLinea,

                    X1 = 20,

                    Y1 = (MyCanvas.Height / 2.0f),

                    X2 = MyCanvas.Width - 20,

                    Y2 = (MyCanvas.Height / 2.0f),

                };

                CanvasAreaDibujo.Children.Add(EjeX);

     

     

                aSepMarcasX = (MyCanvas.Width) / aNroDivX; //Dibujamos los numeros para el eje X

                double k = 0d;

                for (double i = 20; i <= MyCanvas.Width - 20; i += aSepMarcasX)

                {

                    TextBlock tb = new TextBlock() { Text = (k).ToString(), Foreground = aColorNumeros, FontFamily = new FontFamily("Arial"), FontSize = 9, FontWeight = FontWeights.Bold };

                    CanvasAreaDibujo.Children.Add(tb);

                    Canvas.SetLeft(tb, i - 2);

                    Canvas.SetTop(tb, (MyCanvas.Height / 2.0f) + 10);

                    k++;

                }

     

            }

     

            /* ****************************************** Propiedades De Dependencia ****************************************** */

     

            public static DependencyProperty NroDivXProperty = DependencyProperty.Register("NroDivX", typeof(double), typeof(UserControl_EjeX),

                                                       new FrameworkPropertyMetadata(5.0, new PropertyChangedCallback(OnDoubleChanged)));

            public double NroDivX

            {

                get { return (double)GetValue(NroDivXProperty); }

                set { SetValue(NroDivXProperty, value); }

            }

     

            public static DependencyProperty GrosorLineaProperty = DependencyProperty.Register("GrosorLinea", typeof(double), typeof(UserControl_EjeX),

                                                                 new FrameworkPropertyMetadata(1.0, new PropertyChangedCallback(OnDoubleChanged)));

            public double GrosorLinea

            {

                get { return (double)GetValue(GrosorLineaProperty); }

                set { SetValue(GrosorLineaProperty, value); }

            }

     

            public static DependencyProperty ColorNumerosProperty = DependencyProperty.Register("ColorNumeros", typeof(Brush), typeof(UserControl_EjeX),

                                                             new FrameworkPropertyMetadata(Brushes.DarkOliveGreen, new PropertyChangedCallback(OnColorChanged)));

            public Brush ColorNumeros

            {

                get { return (Brush)GetValue(ColorNumerosProperty); }

                set { SetValue(ColorNumerosProperty, value); }

            }

     

            /* ****************************************** Callbacks Para Las Propiedades ****************************************** */

     

            private static void OnColorChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)

            {

                UserControl_EjeX GrapCont = (UserControl_EjeX)sender;

                GrapCont.aColorNumeros = (Brush)e.NewValue; // No se si sera : GrapCont.ColorNumeros = (Brush)e.NewValue;

            }

           

            private static void OnDoubleChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)

            {

                //UserControl_EjeX GrapCont = new UserControl_EjeX(); // En que casos se usa esta forma ? no lo se

                UserControl_EjeX GrapCont = (UserControl_EjeX)sender;

     

                if (e.Property == NroDivXProperty)

                    GrapCont.aNroDivX = (double)e.NewValue; // o talvez sea  GrapCont.NroDivX = (double)e.NewValue; // no lo se

                else if (e.Property == GrosorLineaProperty)

                    GrapCont.aGrosorLinea = (double)e.NewValue;

            }

     

        }

     

     

     

    ////////////////////////////////////////////////////////////////////////////////////////////////////

     

    Ventana Principal No se actualizan mis datos

     

    <Window x:Class="WpfPruebaUserControl.MainWindow"

            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

            xmlns:local="clr-namespace:WpfPruebaUserControl"

            Title="MainWindow" Height="300" Width="600">

        <Grid>

            <local:UserControl_EjeX NroDivX="20" GrosorLinea="5" ColorNumeros="Green" />

        </Grid>

    </Window>

     


    • Editado CesitarPs miércoles, 10 de octubre de 2012 1:04
    • Cambiado Leandro TuttiniMVP miércoles, 10 de octubre de 2012 4:50 (De:Lenguaje C#)
    miércoles, 10 de octubre de 2012 0:47

Todas las respuestas