views:

1589

answers:

1

Here's one for all you XAML wizards: The WPF Toolkit Calendar control (June 2009) appears to have a bug. The bug only crops up when you modify the control template for the calendar, specifically, the PART_CalendarItem.

At the end of this message, I have included the XAML for a (Blend 3.0) window that declares a Calendar and assigns it a control template. The control template is an unmodified copy of the Calendar control template, which I got by editing a copy of the control template (in Blend) for the Calendar control and the PART_CalendarItem control.

In line 78 of the XAML (Marked with a comment "EXCEPTION" below), the VisualStateManager assigns a TextColor to a mouse-over on the Month header of the control. However, in the control template the text color is assigned to the Grid that holds the Month button, rather than the month button itself. That causes an exception in both VS2008 and Blend 3.0 when a calendar is assigned the unmodified control template, as in the XAML below.

I can't quite figure out how to modify the control template to eliminate the bug, short of removing the mouse-over highlighting. I'd like to keep it, but I don't see what the TextColor property should target. Any suggestions? Thanks for your help!





XAML Markup


<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Custom="http://schemas.microsoft.com/wpf/2008/toolkit"
    x:Class="WpfApplication1.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480">
    <Window.Resources>
     <Style x:Key="CalendarStyle1" TargetType="{x:Type Custom:Calendar}">
      <Setter Property="Foreground" Value="#FF333333"/>
      <Setter Property="Background">
       <Setter.Value>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
         <GradientStop Color="#FFE4EAF0" Offset="0"/>
         <GradientStop Color="#FFECF0F4" Offset="0.16"/>
         <GradientStop Color="#FFFCFCFD" Offset="0.16"/>
         <GradientStop Color="White" Offset="1"/>
        </LinearGradientBrush>
       </Setter.Value>
      </Setter>
      <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="BorderThickness" Value="1"/>
      <Setter Property="Template">
       <Setter.Value>
        <ControlTemplate TargetType="{x:Type Custom:Calendar}">
         <StackPanel x:Name="PART_Root" HorizontalAlignment="Center">
          <Custom:CalendarItem x:Name="PART_CalendarItem" Style="{DynamicResource CalendarItemStyle1}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"/>
         </StackPanel>
        </ControlTemplate>
       </Setter.Value>
      </Setter>
     </Style>
     <Style x:Key="CalendarItemStyle1" TargetType="{x:Type Custom:CalendarItem}">
      <Setter Property="Margin" Value="0,3"/>
      <Setter Property="Template">
       <Setter.Value>
        <ControlTemplate TargetType="{x:Type Custom:CalendarItem}">
         <ControlTemplate.Resources>
          <DataTemplate x:Key="DayTitleTemplate">
           <TextBlock HorizontalAlignment="Center" Margin="0,6" VerticalAlignment="Center" FontFamily="Verdana" FontSize="9.5" FontWeight="Bold" Foreground="#FF333333" Text="{Binding}"/>
          </DataTemplate>
         </ControlTemplate.Resources>
         <Grid x:Name="PART_Root">
          <Grid.Resources>
           <SolidColorBrush x:Key="DisabledColor" Color="#A5FFFFFF"/>
          </Grid.Resources>
          <VisualStateManager.VisualStateGroups>
           <VisualStateGroup x:Name="CommonStates">
            <VisualState x:Name="Normal"/>
            <VisualState x:Name="Disabled">
             <Storyboard>
              <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="PART_DisabledVisual" Storyboard.TargetProperty="Opacity" To="1"/>
             </Storyboard>
            </VisualState>
           </VisualStateGroup>
          </VisualStateManager.VisualStateGroups>
          <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1">
           <Border BorderBrush="White" BorderThickness="2" CornerRadius="1">
            <Grid>
             <Grid.Resources>
              <ControlTemplate x:Key="HeaderButtonTemplate" TargetType="{x:Type Button}">
               <Grid Cursor="Hand">
                <VisualStateManager.VisualStateGroups>
                 <VisualStateGroup x:Name="CommonStates">
                  <VisualState x:Name="Normal"/>
                  <VisualState x:Name="MouseOver">
                   <Storyboard>
                    <ColorAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8"/> <!-- EXCEPTION -->
                   </Storyboard>
                  </VisualState>
                  <VisualState x:Name="Disabled">
                   <Storyboard>
                    <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="buttonContent" Storyboard.TargetProperty="Opacity" To="0.5"/>
                   </Storyboard>
                  </VisualState>
                 </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <ContentPresenter x:Name="buttonContent" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="1,4,1,9" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" TextElement.Foreground="#FF333333" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
               </Grid>
              </ControlTemplate>
              <ControlTemplate x:Key="NextButtonTemplate" TargetType="{x:Type Button}">
               <Grid Cursor="Hand">
                <VisualStateManager.VisualStateGroups>
                 <VisualStateGroup x:Name="CommonStates">
                  <VisualState x:Name="Normal"/>
                  <VisualState x:Name="MouseOver">
                   <Storyboard>
                    <ColorAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8"/>
                   </Storyboard>
                  </VisualState>
                  <VisualState x:Name="Disabled">
                   <Storyboard>
                    <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Opacity" To="0.5"/>
                   </Storyboard>
                  </VisualState>
                 </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <Rectangle Fill="#11E5EBF1" Stretch="Fill" Opacity="1"/>
                <Grid>
                 <Path Fill="#FF333333" Stretch="Fill" HorizontalAlignment="Right" Margin="0,-6,14,0" VerticalAlignment="Center" Width="6" Height="10" Data="M282.875,231.875L282.875,240.375 288.625,236z"/>
                </Grid>
               </Grid>
              </ControlTemplate>
              <ControlTemplate x:Key="PreviousButtonTemplate" TargetType="{x:Type Button}">
               <Grid Cursor="Hand">
                <VisualStateManager.VisualStateGroups>
                 <VisualStateGroup x:Name="CommonStates">
                  <VisualState x:Name="Normal"/>
                  <VisualState x:Name="MouseOver">
                   <Storyboard>
                    <ColorAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8"/>
                   </Storyboard>
                  </VisualState>
                  <VisualState x:Name="Disabled">
                   <Storyboard>
                    <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Opacity" To="0.5"/>
                   </Storyboard>
                  </VisualState>
                 </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <Rectangle Fill="#11E5EBF1" Stretch="Fill" Opacity="1"/>
                <Grid>
                 <Path Fill="#FF333333" Stretch="Fill" HorizontalAlignment="Left" Margin="14,-6,0,0" VerticalAlignment="Center" Width="6" Height="10" Data="M288.75,232.25L288.75,240.625 283,236.625z"/>
                </Grid>
               </Grid>
              </ControlTemplate>
             </Grid.Resources>
             <Grid.ColumnDefinitions>
              <ColumnDefinition Width="Auto"/>
              <ColumnDefinition Width="Auto"/>
              <ColumnDefinition Width="Auto"/>
             </Grid.ColumnDefinitions>
             <Grid.RowDefinitions>
              <RowDefinition Height="Auto"/>
              <RowDefinition Height="*"/>
             </Grid.RowDefinitions>
             <Button x:Name="PART_PreviousButton" HorizontalAlignment="Left" Width="28" Height="20" Focusable="False" Grid.Column="0" Grid.Row="0">
              <Button.Template>
               <ControlTemplate TargetType="{x:Type Button}">
                <Grid Cursor="Hand">
                 <VisualStateManager.VisualStateGroups>
                  <VisualStateGroup x:Name="CommonStates">
                   <VisualState x:Name="Normal"/>
                   <VisualState x:Name="MouseOver">
                    <Storyboard>
                     <ColorAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8"/>
                    </Storyboard>
                   </VisualState>
                   <VisualState x:Name="Disabled">
                    <Storyboard>
                     <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Opacity" To="0.5"/>
                    </Storyboard>
                   </VisualState>
                  </VisualStateGroup>
                 </VisualStateManager.VisualStateGroups>
                 <Rectangle Fill="#11E5EBF1" Stretch="Fill" Opacity="1"/>
                 <Grid>
                  <Path Fill="#FF333333" Stretch="Fill" HorizontalAlignment="Left" Margin="14,-6,0,0" VerticalAlignment="Center" Width="6" Height="10" Data="M288.75,232.25L288.75,240.625 283,236.625z"/>
                 </Grid>
                </Grid>
               </ControlTemplate>
              </Button.Template>
             </Button>
             <Button x:Name="PART_HeaderButton" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10.5" FontWeight="Bold" Focusable="False" Grid.Column="1" Grid.Row="0" Template="{DynamicResource ButtonControlTemplate1}"/>
             <Button x:Name="PART_NextButton" HorizontalAlignment="Right" Width="28" Height="20" Focusable="False" Grid.Column="2" Grid.Row="0">
              <Button.Template>
               <ControlTemplate TargetType="{x:Type Button}">
                <Grid Cursor="Hand">
                 <VisualStateManager.VisualStateGroups>
                  <VisualStateGroup x:Name="CommonStates">
                   <VisualState x:Name="Normal"/>
                   <VisualState x:Name="MouseOver">
                    <Storyboard>
                     <ColorAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8"/>
                    </Storyboard>
                   </VisualState>
                   <VisualState x:Name="Disabled">
                    <Storyboard>
                     <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Opacity" To="0.5"/>
                    </Storyboard>
                   </VisualState>
                  </VisualStateGroup>
                 </VisualStateManager.VisualStateGroups>
                 <Rectangle Fill="#11E5EBF1" Stretch="Fill" Opacity="1"/>
                 <Grid>
                  <Path Fill="#FF333333" Stretch="Fill" HorizontalAlignment="Right" Margin="0,-6,14,0" VerticalAlignment="Center" Width="6" Height="10" Data="M282.875,231.875L282.875,240.375 288.625,236z"/>
                 </Grid>
                </Grid>
               </ControlTemplate>
              </Button.Template>
             </Button>
             <Grid x:Name="PART_MonthView" Margin="6,-1,6,6" Visibility="Visible" Grid.ColumnSpan="3" Grid.Row="1">
              <Grid.ColumnDefinitions>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
              </Grid.ColumnDefinitions>
              <Grid.RowDefinitions>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
              </Grid.RowDefinitions>
             </Grid>
             <Grid x:Name="PART_YearView" Margin="6,-3,7,6" Visibility="Hidden" Grid.ColumnSpan="3" Grid.Row="1">
              <Grid.ColumnDefinitions>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="Auto"/>
              </Grid.ColumnDefinitions>
              <Grid.RowDefinitions>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
              </Grid.RowDefinitions>
             </Grid>
            </Grid>
           </Border>
          </Border>
          <Rectangle x:Name="PART_DisabledVisual" Fill="#A5FFFFFF" Stretch="Fill" Stroke="#A5FFFFFF" StrokeThickness="1" RadiusX="2" RadiusY="2" Opacity="0" Visibility="Collapsed"/>
         </Grid>
         <ControlTemplate.Triggers>
          <Trigger Property="IsEnabled" Value="False">
           <Setter Property="Visibility" TargetName="PART_DisabledVisual" Value="Visible"/>
          </Trigger>
          <DataTrigger Binding="{Binding DisplayMode, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type Custom:Calendar}}}" Value="Year">
           <Setter Property="Visibility" TargetName="PART_MonthView" Value="Hidden"/>
           <Setter Property="Visibility" TargetName="PART_YearView" Value="Visible"/>
          </DataTrigger>
          <DataTrigger Binding="{Binding DisplayMode, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type Custom:Calendar}}}" Value="Decade">
           <Setter Property="Visibility" TargetName="PART_MonthView" Value="Hidden"/>
           <Setter Property="Visibility" TargetName="PART_YearView" Value="Visible"/>
          </DataTrigger>
         </ControlTemplate.Triggers>
        </ControlTemplate>
       </Setter.Value>
      </Setter>
     </Style>
     <ControlTemplate x:Key="ButtonControlTemplate1" TargetType="{x:Type Button}">
      <Grid Cursor="Hand">
       <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="CommonStates">
         <VisualState x:Name="Normal"/>
         <VisualState x:Name="MouseOver">
          <Storyboard>
           <ColorAnimation Duration="00:00:00" Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8"/>
          </Storyboard>
         </VisualState>
         <VisualState x:Name="Disabled">
          <Storyboard>
           <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="buttonContent" Storyboard.TargetProperty="Opacity" To="0.5"/>
          </Storyboard>
         </VisualState>
        </VisualStateGroup>
       </VisualStateManager.VisualStateGroups>
       <ContentPresenter x:Name="buttonContent" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="1,4,1,9" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" TextElement.Foreground="#FF333333" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
      </Grid>
     </ControlTemplate>
    </Window.Resources>

    <Grid x:Name="LayoutRoot">
     <Custom:Calendar HorizontalAlignment="Left" VerticalAlignment="Top" Style="{DynamicResource CalendarStyle1}"/>
    </Grid>
</Window>
+1  A: 

We just experienced the same thing at work. This doesn't appear to be a bug in the WPFToolkit, rather there is an issue with Expression Blend which crops up because the people who made the original template got a little tricky.

First, go grab the default template. If you download the source they will be in Toolkit-Release/Calendar/Themes/Generic.xaml. The source can be found on the WPF Toolkit CodePlex site. http://wpf.codeplex.com/

The CalendarItemTemplate has this sort of a setup:

<Style TargetType="primitives:CalendarItem">
...
<Setter Property="Template">
   <Setter.Value>
      <ControlTemplate TargetType="primitives:CalendarItem">
          ...
          <Grid Name="PART_Root" >
              <Border 
                  ...  
                   <Border CornerRadius="1" BorderBrush="#FFFFFFFF" BorderThickness="2">
                       <Grid>
                           <Grid.Resources>
                               <ControlTemplate x:Key="HeaderButtonTemplate" TargetType="Button">
                           ...
                            <Button x:Name="PART_HeaderButton" Template="{StaticResource HeaderButtonTemplate}"    
                           ...

This is the original HeaderButtonTemplate:

<ControlTemplate x:Key="HeaderButtonTemplate" TargetType="Button">
    <Grid Cursor="Hand">
        <vsm:VisualStateManager.VisualStateGroups>
            <vsm:VisualStateGroup x:Name="CommonStates">
                <vsm:VisualState x:Name="Normal" />
                <vsm:VisualState x:Name="MouseOver">
                    <Storyboard>
                        <ColorAnimation Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8" Duration="0" />
                    </Storyboard>
                </vsm:VisualState>
                <vsm:VisualState x:Name="Disabled">
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="buttonContent" Storyboard.TargetProperty="Opacity" To=".5" Duration="0" />
                    </Storyboard>
                </vsm:VisualState>
            </vsm:VisualStateGroup>
        </vsm:VisualStateManager.VisualStateGroups>
        <ContentPresenter
          x:Name="buttonContent"
          Content="{TemplateBinding Content}"
          ContentTemplate="{TemplateBinding ContentTemplate}"
          Margin="1,4,1,9"
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
             <TextElement.Foreground>
                <SolidColorBrush x:Name="TextColor" Color="#FF333333"/>
            </TextElement.Foreground>
        </ContentPresenter>
    </Grid>
</ControlTemplate>

The part that concerns us is here:

<ContentPresenter
  x:Name="buttonContent"
  Content="{TemplateBinding Content}"
  ContentTemplate="{TemplateBinding ContentTemplate}"
  Margin="1,4,1,9"
  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
  VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
     <TextElement.Foreground>
        <SolidColorBrush x:Name="TextColor" Color="#FF333333"/>
    </TextElement.Foreground>
</ContentPresenter>

Notice the TextElement attached property setter that instantiates the SolidColorBrush. This is the named brush that is targeted by the storyboards.

When you do the "Edit Copy of Template" thing in Blend, it will inline some of the templates so that the Header button template will be set directly instead of being contained in the grid resources.

<Button x:Name="PART_HeaderButton" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10.5" FontWeight="Bold" Focusable="False" Grid.Column="1" Grid.Row="0">
 <Button.Template>
  <ControlTemplate TargetType="{x:Type Button}">
   <Grid Cursor="Hand">

I don't know why it does this, when I edit a copy of a template I'm expecting an actual copy of the template. I suppose I understand that sometimes a template is referenced from outside, but in this case it's not - and even if it is it seems more prudent to copy it in its entirety and add it to the style/controltemplate resources. What is worse, as part of the reprocessing Blend modifies the contentpresenter definition in the template, turning it into this:

<ContentPresenter x:Name="buttonContent" 
    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
    Margin="1,4,1,9" 
    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
    ContentTemplate="{TemplateBinding ContentTemplate}"
    Content="{TemplateBinding Content}"
    TextElement.Foreground="#FF333333"  />

So, in other words no more named brush, and the storyboard target is now incorrect.

Fortunately the fix is easy - use the original template as your starting point. Trouble is, blend doesn't like it and won't display because for some reason it can only set this attached property on the contentpresenter as part of the opening tag, not in the expanded mode or whatever it's called. Of course, it's probably quite possible to duplicate the functionality in another manner that is more blendable.

EDIT: Here is a quick way to hack up the template to make it blendable. And it really is a hack, though mostly a harmless one. I don't advocate doing things like this normally, but it does seem to work fine.

<ControlTemplate x:Key="HeaderButtonTemplate" TargetType="Button">
    <Grid Cursor="Hand">
     <vsm:VisualStateManager.VisualStateGroups>
      <vsm:VisualStateGroup x:Name="CommonStates">
       <vsm:VisualState x:Name="Normal" />
       <vsm:VisualState x:Name="MouseOver">
        <Storyboard>
         <ColorAnimation Storyboard.TargetName="TextColor" Storyboard.TargetProperty="Color" To="#FF73A9D8" Duration="0" />
        </Storyboard>
       </vsm:VisualState>
       <vsm:VisualState x:Name="Disabled">
        <Storyboard>
         <DoubleAnimation Storyboard.TargetName="buttonContent" Storyboard.TargetProperty="Opacity" To=".5" Duration="0" />
        </Storyboard>
       </vsm:VisualState>
      </vsm:VisualStateGroup>
     </vsm:VisualStateManager.VisualStateGroups>
     <!-- A dummy Rectangle that is essentially a container for the TextColor brush -->
     <Rectangle Width="0" Height="0">
      <Rectangle.Fill>
       <SolidColorBrush x:Name="TextColor" Color="#FF333333"/>
      </Rectangle.Fill> 
     </Rectangle>
     <ContentPresenter
                x:Name="buttonContent"
                Content="{TemplateBinding Content}"
                ContentTemplate="{TemplateBinding ContentTemplate}"
                Margin="1,4,1,9"
                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                TextElement.Foreground="{Binding ElementName=TextColor}">
     </ContentPresenter>
    </Grid>
</ControlTemplate>

The essense of it is to house the brush as part of another object - technically visible if too small to be shown, and then do a binding on the contentpresenter - because it's done in the opening tag Blend doesn't complain. Yeah I know, this sort of smells, but it's the smallest rewrite of the original template that I can see to make it work.

Egor
Accepted *and* an upvote. Thanks for the answer to a particularly thorny question!
David Veeneman
Submitted as a bug on the Expression Blend Feedback page: https://connect.microsoft.com/Expression/feedback/ViewFeedback.aspx?FeedbackID=495224
David Veeneman
You welcome - I edited my answer to provide a quick and sort of dirty way to make it blendable.
Egor
David Veeneman
Interesting - the template rewrite I can understand, I've never browsed xaml resources with Reflector+BamlViewer though I should. Without doing so I can't say what Blend has access to. But it seems that at the very least Blend should not freak out about assigning a textelement.foreground to a content presenter - especially when it works fine at runtime, in cider, and doesn't seem to break the rules.
Egor
VisualStateManager.VisualStateGroups is just like hell. It doesn't let me compile the app with that custom style for calendar. It throws an exception on editor: The attachable property 'VisualStateGroups' was not found in type 'VisualStateManager'
Junior Mayhé
That's strange, it compiled and ran just fine for me. The error also doesn't seem to make sense - are you sure that everything is referenced correctly?
Egor