none
Problema con múltiples custom controls y propiedades dedependencia RRS feed

  • Pregunta

  • Saludos a todos,

    Tengo un problema intentando implementar una solución para un proyecto que estoy haciendo y no estoy seguro si tengo alguna confusión de concepto o si por el contrario estoy haciendo algo mal.

    Definí un estilo para un Control creado por mi llamado RibbonToggleButton (Hereda de ToggleButton) y sobreescribí su ControlTemplate. En el Template agregué un Textblock, cuya propiedad Text enlacé con una propiedad de dependencia de tipo String que agregué en la clase RibbonToggleButton.

    El control funciona bien siempre y cuando cree una sola instancia de RibbonToggleButton en el XAML de mi aplicación principal. En el momento en que agrego un segundo control RibbonToggleButton, la propiedad Text deja de funcionar.

    Quizás entiendo mal y las propiedades de dependencia están atadas a una única Instancia de un control (Algo que no me parece que tenga sentido debido a que las propiedades nativas de los controles no muestran este comportamiento) o quizás me falta agregar algo al código, pero el punto es que tengo dos días buscando y buscando en Google y no he logrado solucionarlo. 

    Pongo parte del código a ver si pueden ayudarme a resolver mis dudas:

     

    Código del Control:

        public class RibbonButton : ToggleButton
        {
            public string ButtonText
            {
                get { return (string)GetValue(ButtonTextProperty); }
                set { SetValue(ButtonTextProperty, value);         }
            }
    
            DependencyProperty ButtonTextProperty = DependencyProperty.Register("ButtonText", typeof(string), typeof(RibbonButton), new PropertyMetadata(""));
        }
    

    Estilo en el archivo de Recursos:

        <Style TargetType="local:RibbonButton" x:Key="RibbonBtn">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Foreground" Value="#FF000000"/>
            <Setter Property="Padding" Value="3"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="BorderBrush">
                <Setter.Value>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FFA3AEB9" Offset="0"/>
                        <GradientStop Color="#FF8399A9" Offset="0.375"/>
                        <GradientStop Color="#FF718597" Offset="0.375"/>
                        <GradientStop Color="#FF617584" Offset="1"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:RibbonButton">
                        <Grid>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundAnimation"/>
                                            <ColorAnimation Duration="0" To="#fbeaa4" Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="BackgroundAnimation"/>
                                            <ColorAnimation Duration="0" To="#fae283" Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[2].(GradientStop.Color)" Storyboard.TargetName="BackgroundAnimation"/>
                                            <ColorAnimation Duration="0" To="#ffe065" Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[3].(GradientStop.Color)" Storyboard.TargetName="BackgroundAnimation"/>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundAnimation"/>
                                            <ColorAnimation  Duration="0" To="#D8FFFFFF" Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="BackgroundAnimation"/>
                                            <ColorAnimation  Duration="0" To="#C6FFFFFF" Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="BackgroundAnimation"/>
                                            <ColorAnimation  Duration="0" To="#8CFFFFFF" Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[2].(GradientStop.Color)" Storyboard.TargetName="BackgroundAnimation"/>
                                            <ColorAnimation  Duration="0" To="#3FFFFFFF" Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[3].(GradientStop.Color)" Storyboard.TargetName="BackgroundAnimation"/>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Disabled">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To=".55" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="DisabledVisualElement"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="FocusStates">
                                    <VisualState x:Name="Focused">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualElement"/>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Unfocused">
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
    
                            <Border x:Name="Background" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
                                <Grid Background="{TemplateBinding Background}" Margin="1">
                                    <Border x:Name="BackgroundAnimation" Opacity="0" CornerRadius="5">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                                <GradientStop Color="Transparent" Offset="0"/>
                                                <GradientStop Color="Transparent" Offset="0.375"/>
                                                <GradientStop Color="Transparent" Offset="0.625"/>
                                                <GradientStop Color="Transparent" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                    </Border>
                                </Grid>
                            </Border>
    
                            <ContentPresenter x:Name              = "contentPresenter" 
                                              ContentTemplate     = "{TemplateBinding ContentTemplate}" 
    							              HorizontalAlignment = "{TemplateBinding HorizontalContentAlignment}" 
    									      Margin              = "{TemplateBinding Padding}" 
                                              VerticalAlignment   = "{TemplateBinding VerticalContentAlignment}">
    
                                <ContentPresenter.Content>
                                    <StackPanel Orientation="Vertical">
       
                                        <TextBlock Text="{RelativeSource TemplatedParent}, Path=ButtonText}"></TextBlock>
                                        
                                    </StackPanel>
                                </ContentPresenter.Content>
                            </ContentPresenter>
    
                            <Rectangle x:Name="DisabledVisualElement" Fill="#FFFFFFFF" IsHitTestVisible="false" Opacity="0" RadiusY="3" RadiusX="3"/>
                            <Rectangle x:Name="FocusVisualElement" IsHitTestVisible="false" Margin="1" Opacity="0" RadiusY="2" RadiusX="2" Stroke="#FF6DBDD1" StrokeThickness="1"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    XAML de los controles en el MainPage.xaml

                                <local:RibbonButton x:Name="btnDeleteElement" 
                                                    Width="170" 
                                                    Height="55" 
                                                    Style="{StaticResource RibbonBtn}"
                                                    ButtonText="Eliminar Actividad">
                                </local:RibbonButton>
    
    <pre lang="x-xml">                            <local:RibbonButton x:Name="btnAddElement" 
                                                    Width="170" 
                                                    Height="55" 
                                                    Style="{StaticResource RibbonBtn}"
                                                    ButtonText="Agregar Actividad">
                                </local:RibbonButton>
    


    viernes, 25 de noviembre de 2011 20:48

Respuestas

  • Hola Ricardo

    Realiza estos cambios:

    public class RibbonButton : ToggleButton
        {
            public string ButtonText
            {
                get { return (string)base.GetValue(ButtonTextProperty); }
                set { base.SetValue(ButtonTextProperty, value);         }
            }
    
            public static DependencyProperty ButtonTextProperty = DependencyProperty.Register("ButtonText", typeof(string), typeof(RibbonButton), new PropertyMetadata(""
    

    Y este en tu xaml... aunque esto no se si sea necesario:
    <ContentPresenter x:Name              = "contentPresenter" 
                                ContentTemplate     = "{TemplateBinding ContentTemplate}" 
    			    HorizontalAlignment = "{TemplateBinding HorizontalContentAlignment}" 
    			    Margin              = "{TemplateBinding Padding}" 
                                VerticalAlignment   = "{TemplateBinding VerticalContentAlignment}">
        <ContentPresenter.Content>
            <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ButtonText}" />
            </StackPanel>
        </ContentPresenter.Content>
    </ContentPresenter>
    
    Un saludo


    Antonio Lobo
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi blog
    • Propuesto como respuesta Antonio Lobo lunes, 28 de noviembre de 2011 15:47
    • Marcado como respuesta Ricardo Recaredo lunes, 28 de noviembre de 2011 17:49
    viernes, 25 de noviembre de 2011 21:35

Todas las respuestas

  • Hola Ricardo

    Realiza estos cambios:

    public class RibbonButton : ToggleButton
        {
            public string ButtonText
            {
                get { return (string)base.GetValue(ButtonTextProperty); }
                set { base.SetValue(ButtonTextProperty, value);         }
            }
    
            public static DependencyProperty ButtonTextProperty = DependencyProperty.Register("ButtonText", typeof(string), typeof(RibbonButton), new PropertyMetadata(""
    

    Y este en tu xaml... aunque esto no se si sea necesario:
    <ContentPresenter x:Name              = "contentPresenter" 
                                ContentTemplate     = "{TemplateBinding ContentTemplate}" 
    			    HorizontalAlignment = "{TemplateBinding HorizontalContentAlignment}" 
    			    Margin              = "{TemplateBinding Padding}" 
                                VerticalAlignment   = "{TemplateBinding VerticalContentAlignment}">
        <ContentPresenter.Content>
            <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ButtonText}" />
            </StackPanel>
        </ContentPresenter.Content>
    </ContentPresenter>
    
    Un saludo


    Antonio Lobo
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi blog
    • Propuesto como respuesta Antonio Lobo lunes, 28 de noviembre de 2011 15:47
    • Marcado como respuesta Ricardo Recaredo lunes, 28 de noviembre de 2011 17:49
    viernes, 25 de noviembre de 2011 21:35
  • Muchas gracias Antonio. En efecto se me había olvidado colocar el modificador static a mis propiedades. Hice los cambios que me sugeriste y ya funciona bien. Trataré de ahora en adelante de usar los Snippets que vienene con el VS para evitar este tipo de errores.

     

    Muchas gracias y saludos

    lunes, 28 de noviembre de 2011 17:51