Почему стиль, который у меня есть в шаблоне элемента управления, не может использовать привязку шаблона? - PullRequest
0 голосов
/ 26 апреля 2010

У меня есть этот шаблон управления, который я пишу:

<Style TargetType="{x:Type controls:InfoBar}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:InfoBar}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <StackPanel>
                        <Grid>
                            <Grid.Resources>
                                <Style TargetType="{x:Type TextBlock}">
                                    <Setter Property="FontFamily" Value="{TemplateBinding FontFamily}" />
                                    <Setter Property="FontSize" Value="{TemplateBinding FontSize}" />
                                    <Setter Property="Foreground" Value="{TemplateBinding Foreground}" />
                                </Style>
                            </Grid.Resources>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                                <ColumnDefinition />
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>
                            <ItemsControl Grid.Column="0" ItemsSource="{TemplateBinding LeftInfoBarTextBlockCollection}">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <WrapPanel />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                            </ItemsControl>
                            <ItemsControl Grid.Column="1" ItemsSource="{TemplateBinding MiddleInfoBarTextBlockCollection}">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <WrapPanel />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                            </ItemsControl>
                            <ItemsControl Grid.Column="2" ItemsSource="{TemplateBinding RightInfoBarTextBlockCollection}">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <WrapPanel />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                            </ItemsControl>
                        </Grid>
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

В этом разделе xaml выдается member is not valid because it does not contain a valid type name. исключений для привязок шаблонов в FontFamily, FontSize и Foreground.

<Grid.Resources>

Если я изменю это на:

 <Grid.Resources>

Он будет собираться, но когда я отлаживаю его, я получаю это XmlParseExeption:

Set property 'System.Windows.Setter.Value' threw an exception.

Если я изменю controls:InfoBar на Control, от которого наследуется инфо-бар, я получу то же исключение.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Чтобы ответить на ваш второй вопрос, Джастин, вы можете создать стиль, который применяет шаблон элемента управления.

Обратите внимание, что этот стиль назначает шаблон элемента управления свойству «Шаблон» для кнопки, когда для стиля кнопки установлено значение NumberPushpinStyle.

<Style x:Key="NumberPushpinStyle" TargetType="m:Pushpin">
  <Setter Property="BorderBrush" Value="#FFF4F4F5" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate>
        <Grid>
          <Ellipse Fill="Black" Height="33" Stroke="White" StrokeThickness="2" Width="33" RenderTransformOrigin="0.5,0.5">
            <Ellipse.RenderTransform>
              <CompositeTransform TranslateX="-16" TranslateY="16" />
            </Ellipse.RenderTransform>
          </Ellipse>
          <TextBlock Foreground="White" Text="{TemplateBinding Content}" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0">
            <TextBlock.RenderTransform>
              <CompositeTransform TranslateX="-16" TranslateY="15" />
            </TextBlock.RenderTransform>
          </TextBlock>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>
1 голос
/ 26 апреля 2010

Проблема в этом:

<Style TargetType="{x:Type TextBlock}">         
   <Setter Property="FontFamily" Value="{TemplateBinding FontFamily}" />         
   <Setter Property="FontSize" Value="{TemplateBinding FontSize}" />         
   <Setter Property="Foreground" Value="{TemplateBinding Foreground}" />         
</Style>

Вы можете использовать TemplateBinding только внутри шаблона элемента управления. и вот вы используете его внутри стиля.

...