Unable to set Foreground color in a ChartAnnotationLabelDefinition?

7 posts, 1 answers
  1. Joe
    Joe avatar
    85 posts
    Member since:
    Nov 2017

    Posted 05 Apr Link to this post

    My RadCartesianChart uses an AnnotationsProvider showing CartesianPlotBandAnnotations.  I set the LabelDefinitions with a DefaultVisualStyle that had the text as I wanted it.  And it honors every property I set except the text color.  That gets ignored, no matter what I set it to.  

    I've attached an image that shows what it looks like.  You can see the region labels (literally named "Top" and "Bottom").  They show up in Italics as I want and using the FontSize I want.  But the color remains grey when I'm trying to set it to white.

    Here's my label definition resource

    <tk:ChartAnnotationLabelDefinition x:Key="BandLabelDefinition" Location="Inside" VerticalAlignment="Bottom">
        <tk:ChartAnnotationLabelDefinition.DefaultVisualStyle>
            <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockStyle}">
                <Setter Property="FontSize"  Value="{Binding Source={core:Settings}, Path=FontSizeSmall}"/>
                <Setter Property="FontStyle" Value="Italic"/>
                <Setter Property="Foreground" Value="White"/>
            </Style>
        </tk:ChartAnnotationLabelDefinition.DefaultVisualStyle>
    </tk:ChartAnnotationLabelDefinition>


    And here's the bit where I set it in the style of the CartesianPlotBandAnnotation

    <Style x:Key="RegionBandStyle"
           TargetType="{x:Type tk:CartesianPlotBandAnnotation}">
     
        <d:Style.DataContext>
            <x:Type Type="core:IProfileRegion" />
        </d:Style.DataContext>
     
        <Setter Property="Label"                     Value="{Binding Name}"/>
        <Setter Property="LabelDefinition"     Value="{StaticResource BandLabelDefinition}"/>

    What am I missing here?  How may I set the font color in a label definition?

    (Note: I also tried the approach of using the ChartAnnotationLabelDefinition.Template property instead of "DefaultVisualStyle".  That didn't help at all)

     


  2. Dinko
    Admin
    Dinko avatar
    1144 posts

    Posted 09 Apr Link to this post

    Hello Joe,

    Thank you for the provided details.

    My guess here is the setting the LabelDefinition thought style will have lower priority. Can you set the LabelDifinition directly to the CartesianPlotBandAnnotation, like in the following code snippet and let me know if it makes any difference?

    <telerik:CartesianPlotBandAnnotation From="10" To="25" Axis="{Binding ElementName=verticalAxis}" Label="MY LABEL">
        <telerik:CartesianPlotBandAnnotation.LabelDefinition>
            <telerik:ChartAnnotationLabelDefinition  Location="Inside" VerticalAlignment="Bottom">
                <telerik:ChartAnnotationLabelDefinition.DefaultVisualStyle>
                    <Style TargetType="{x:Type TextBlock}" >
                        <Setter Property="FontSize"  Value="35"/>
                        <Setter Property="FontStyle" Value="Italic"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Style>
                </telerik:ChartAnnotationLabelDefinition.DefaultVisualStyle>
            </telerik:ChartAnnotationLabelDefinition>
        </telerik:CartesianPlotBandAnnotation.LabelDefinition>
    </telerik:CartesianPlotBandAnnotation>

    A question arises after looking at the image. Are you using NoXAML binaries? If yes, can you share which theme is merged in your application? I am asking this because this behavior could be related to a specific theme.

    Regards,
    Dinko
    Progress Telerik

    Progress is here for your business, like always. Read more about the measures we are taking to ensure business continuity and help fight the COVID-19 pandemic.
    Our thoughts here at Progress are with those affected by the outbreak.
  3. Joe
    Joe avatar
    85 posts
    Member since:
    Nov 2017

    Posted 09 Apr in reply to Dinko Link to this post

    Hi Dinko,

    First of all I'm using all the assemblies with Xaml.  e.g.

    Telerik.Windows.Controls.for.Wpf.Xaml
    Telerik.Windows.Controls.Data.for.Wpf.Xaml

    etc etc.

    But that's moot because I think I've figured it out.

    The labels are children of the annotation, are they not?  If so that explains it perfectly.  I'm setting the Opacity of the PlotBandAnnotation to allow the user to see the plot line through them.  And that Opacity would naturally affect all children, including labels. 

    Please confirm that's the case.  Because if it is I'm going to have to figure out how to supply a matching text annotation (with Opacity 1.0) for each and every PlotBand Annotation

  4. Joe
    Joe avatar
    85 posts
    Member since:
    Nov 2017

    Posted 09 Apr in reply to Joe Link to this post

    (I can probably just apply the desired opacity to the brush rather than the the Annotation as a whole...)
  5. Dinko
    Admin
    Dinko avatar
    1144 posts

    Posted 10 Apr Link to this post

    Hi Joe,

    You are right. Setting Opacity to the CartesianPlotBandAnnotation will be propagated to its children. As you said in your post, you can set Opacity to the color. Check the following code snippet.

    <telerik:CartesianPlotBandAnnotation.Fill>
        <SolidColorBrush Color="Red" Opacity=".5" />
    </telerik:CartesianPlotBandAnnotation.Fill>

    Regards,
    Dinko
    Progress Telerik

    Progress is here for your business, like always. Read more about the measures we are taking to ensure business continuity and help fight the COVID-19 pandemic.
    Our thoughts here at Progress are with those affected by the outbreak.
  6. Joe
    Joe avatar
    85 posts
    Member since:
    Nov 2017

    Posted 10 Apr in reply to Dinko Link to this post

    Thanks Dinko.   Unfortunately my opacity cannot be a hard-coded number.  It must actually must change depending on whether or not the user has selected the PlotBandAnnotation in question (because I let them select and drag the annotations).  That means I needed to lay out the brush explicitly in verbose XAML

    Here is how I am currently setting the opacity in the RegionBandStyle.  This worked fine (but now needs to migrate to the Fill property Brush)

    <Setter Property="Opacity">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource CvtEqualToAny}"
                          ConverterParameter="{net:BoolVal False}"
                          FallbackValue="{net:DoubleVal 0}">
     
                <Binding />                                                          <!-- Is THIS region... -->
                <Binding ElementName="Root" Path="ProfileAnalysis.SelectedRegion"/>  <!-- ... the selected region? -->
                <Binding Source="{net:DoubleVal 0.6}"/>                              <!-- Use this Opacity if true -->
                <Binding Source="{net:DoubleVal 0.3}"/>                              <!-- Use this Opacity if false -->
     
            </MultiBinding>
        </Setter.Value>
    </Setter>

     

    (Yeah, that's basically an IMultiValueConverter that does an if-then and chooses one value or another depending on whether or not the current region is selected.)

    But when I try to move that complicated decision to choose the Opacity of the Brush in the Fill property binding.  It doesn't work. 

    <Setter Property="Fill">
        <Setter.Value>
            <SolidColorBrush Color="{Binding Usage, Converter={StaticResource CvtUsageToColor}}">
                <SolidColorBrush.Opacity>
                    <MultiBinding Converter="{StaticResource CvtEqualToAny}"
                                  ConverterParameter="{net:BoolVal False}"
                                  FallbackValue="{net:DoubleVal 0}">
     
                        <Binding />                                                          <!-- Is THIS region... -->
                        <Binding ElementName="Root" Path="ProfileAnalysis.SelectedRegion"/>  <!-- ... the selected region? -->
                        <Binding Source="{net:DoubleVal 0.6}"/>                              <!-- Use this Opacity if true -->
                        <Binding Source="{net:DoubleVal 0.3}"/>                              <!-- Use this Opacity if false -->
     
                    </MultiBinding>
                </SolidColorBrush.Opacity>
            </SolidColorBrush>
        </Setter.Value>
    </Setter>


    Suddenly I don't have the datacontext anymore.  I am pretty sure I know why.  Brush is not in the visual tree, so that first "<Binding />" element in the MultBinding finds nothing.  And tricks like FindAncestor to find the "parent" PlotBandAnnotation, also fail for the same reason -- the brush isn't in the visual tree

    I've found a StackOverflow question that appears to encounter the same issue.

    https://stackoverflow.com/questions/5647055/data-binding-outside-the-visual-tree-data-context-bridging

    It's not clear that the poster ever really found a solution to his problem.  I guess I might just be forced to move all this out of XAML and into a view model

  7. Answer
    Dinko
    Admin
    Dinko avatar
    1144 posts

    Posted 13 Apr Link to this post

    Hi Joe,

    I would go in a different way. In your post, you mentioned that you had implemented a drag-drop of annotation. I am assuming that the user is holding the mouse while dragging the annotation. With this in hand, on the mouse down event (for example), you can add the opacity of the annotation. When the user releases the annotation, end dragging, or mouse up, you can remove the opacity. Is this approach achievable in your application?

    As for your approach. You can try to add RelativeSource binding to find the parent annotation. I am not sure that if this is going to work, but you can try and let me know the outcome.

    <MultiBinding Converter="{StaticResource CvtEqualToAny}"
                ConverterParameter="{net:BoolVal False}"
                FallbackValue="{net:DoubleVal 0}">
        <Binding RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType=telerik:CartesianPlotBandAnnotation}"/>
        <!-- Is THIS region... -->
        <Binding ElementName="Root" Path="ProfileAnalysis.SelectedRegion"/>
        <!-- ... the selected region? -->
        <Binding Source="{net:DoubleVal 0.6}"/>
        <!-- Use this Opacity if true -->
        <Binding Source="{net:DoubleVal 0.3}"/>
        <!-- Use this Opacity if false -->
    </MultiBinding>

    Regards,
    Dinko
    Progress Telerik

    Progress is here for your business, like always. Read more about the measures we are taking to ensure business continuity and help fight the COVID-19 pandemic.
    Our thoughts here at Progress are with those affected by the outbreak.
Back to Top