Возникла исключительная ситуация XamlParseException: не удалось создать 'System.Windows.Style' из текста 'PhoneMasterGridColumnHeader' - PullRequest
6 голосов
/ 31 августа 2010

У меня есть четыре сетки данных на странице Silverlight 4. Я пытаюсь установить разные стили заголовков столбцов для каждой сетки. Я нашел этот XAML, который работает, когда я встраиваю его в каждую DataGrid внутри <sdk:DataGrid.ColumnHeaderStyle> тегов:

  <Style TargetType="primitives:DataGridColumnHeader" >
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="primitives:DataGridColumnHeader">
          <Grid Name="Root">
            <vsm:VisualStateManager.VisualStateGroups>
              <vsm:VisualStateGroup x:Name="SortStates" >
                <vsm:VisualStateGroup.Transitions>
                  <vsm:VisualTransition GeneratedDuration="00:00:0.1" />
                </vsm:VisualStateGroup.Transitions>
                <vsm:VisualState x:Name="Unsorted" />
                <vsm:VisualState x:Name="SortAscending">
                  <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0" />
                  </Storyboard>
                </vsm:VisualState>
                <vsm:VisualState x:Name="SortDescending">
                  <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="SortIcon" Storyboard.TargetProperty="Opacity" Duration="0" To="1.0" />
                    <DoubleAnimation Storyboard.TargetName="SortIconTransform" Storyboard.TargetProperty="ScaleY" Duration="0" To="-.9" />
                  </Storyboard>
                </vsm:VisualState>
              </vsm:VisualStateGroup>
            </vsm:VisualStateManager.VisualStateGroups>
            <Grid.RowDefinitions>
              <RowDefinition Height="*" />
              <RowDefinition Height="*" />
              <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="Auto" />
              <ColumnDefinition Width="*" />
              <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Rectangle x:Name="BackgroundRectangle" Stretch="Fill" Grid.ColumnSpan="2" Grid.RowSpan="2">
              <Rectangle.Fill>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <GradientStop Color="Transparent" Offset="0" />
                  <GradientStop Color="LavenderBlush" Offset="1" />
                </LinearGradientBrush>
              </Rectangle.Fill>
            </Rectangle>
            <ContentPresenter Grid.RowSpan="2" Content="{TemplateBinding Content}" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="{TemplateBinding Padding}" />
            <Rectangle Name="VerticalSeparator" Grid.RowSpan="2" Grid.Column="2" Width="1" VerticalAlignment="Stretch" Fill="{TemplateBinding SeparatorBrush}" Visibility="{TemplateBinding SeparatorVisibility}" />
            <Path Grid.RowSpan="2" Name="SortIcon" RenderTransformOrigin=".5,.5" HorizontalAlignment="Left" VerticalAlignment="Center" Opacity="0" Grid.Column="1" Stretch="Uniform" Width="8" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z ">
              <Path.Fill>
                <SolidColorBrush Color="#FF444444" />
              </Path.Fill>
              <Path.RenderTransform>
                <TransformGroup>
                  <ScaleTransform x:Name="SortIconTransform" ScaleX=".9" ScaleY=".9"  />
                </TransformGroup>
              </Path.RenderTransform>
            </Path>
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>

Когда я помещаю его в отдельный словарь ресурсов и удаляю вышеупомянутые теги, он также работает, применяя ко всем четырем заголовкам. Но когда я пытаюсь создать конкретную версию в словаре ресурсов, но меняю в первой строке следующее:

<Style x:Key="ADGridColumnHeader" TargetType="primitives:DataGridColumnHeader" >

и добавление этого в DataGrid:

ColumnHeaderStyle="PhoneMasterGridColumnHeader"

Я получаю сообщение об ошибке: Произошло исключение XamlParseException: Не удалось создать «System.Windows.Style» из текста «PhoneMasterGridColumnHeader». Я не могу понять, что не так. Я все еще пытаюсь разобраться со стилями и словарями ресурсов. Есть идеи?

1 Ответ

7 голосов
/ 31 августа 2010

Попробуй так: -

 ColumnHeaderStyle="{StaticResource PhoneMasterGridColumnHeader}"

Свойство ColumnHeaderStyle ожидает получения объекта типа Style. Теперь вы можете определить это значение следующим образом: -

 <DataGrid.ColumnHeaderStyle>
    <Style TargetType="primitives:DataGridColumnHeade">
      <!--  You setters here -->
    </Style>
 </DataGrid>

Или вы можете по какой-то странной причине представить стиль как свойство с именем HeaderStyle в ViewModel, которая является текущей DataContext для сетки:

 <DataGrid ColumnHeaderStyle="{Binding HeaderStyle}" >

Дело в том, что существует несколько различных способов получения значений свойств в Xaml. Ссылка на ресурс является лишь одним из них. Следовательно, просто указание ColumnHeaderStyle="MyStyle" является по меньшей мере неоднозначным, поэтому нам нужно объяснить состояние, в котором мы хотим получить значение через статические ресурсы.

...