Неявная ошибка темы: свойство 'Content' не найдено в типе 'System.Windows.Controls.Control' - PullRequest
5 голосов
/ 24 мая 2010

Я получил ошибку при попытке обновить наш большой проект до SL4.Я не писал оригинальную тему, и мои знания темы не велики.В моем демонстрационном приложении у меня есть Label и LabelHeader (который я создал и является просто производным классом от Label с DefaultStyleKey = typeof (LabelHeader);
Я стилизирую LabelHeader следующим образом:

 <Style TargetType="themeControls:LabelHeader">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <DataInput:Label 
                    FontSize="{TemplateBinding FontSize}" 
                    FontFamily="{TemplateBinding FontFamily}" 
                    Foreground="{TemplateBinding Foreground}" 
                    Content="{TemplateBinding  Content}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="FontFamily" Value="Tahoma"/>
    <Setter Property="FontSize" Value="20"/>
    <Setter Property="Foreground" Value="Red"/>
</Style>

Это работает в SL3, но в SL4 я получаю:

Ошибка: необработанная ошибка в Silverlight Код приложения: 2500
Категория: ParserError
Сообщение: свойство 'Content' не найдено в типе 'System.Windows.Controls.Control '.
Файл:
Строка: 9
Позиция: 168

Если изменить это: Content = "{TemplateBinding Content}" на Content = "XXX«Тогда нет ошибки, но, конечно, я получаю XXX на своем ярлыке, а не на содержимом, которое я установил в XAML на странице

Есть идеи, как мне это сделать?

Демопроект здесь:

http://walkersretreat.co.nz/files/ThemeIssue.zip

(Извиняюсь за перепост, у меня пока нет ответов здесь: http://forums.silverlight.net/forums/p/183380/415930.aspx#415930)

РЕДАКТИРОВАТЬ Предоставленный ответ выглядит так, как будто он будетработа. Проблема была открыта для этой проблемы здесь: https://connect.microsoft.com/VisualStudio/feedback/details/561183

проголосуйте, если считаете это важным!

Ответы [ 2 ]

6 голосов
/ 27 мая 2010

Благодаря публикации Вольфа Шмидта (MSFT) на форуме www.silverlight.net проблема была идентифицирована, объяснена и потенциально решена в соответствии с планом. По его словам, Silverlight 4 теперь будет более строго учитывать квазидинамическое поведение Silverlight 3 в отношении ControlTemplates, что приводит к ошибке в Silverlight 4, когда свойство TargetType для ControlTemplate не существует. Важно отметить, что когда TargetType не указан на ControlTemplate, по умолчанию используется TargetType = "Control".

Решение этой проблемы состоит в том, чтобы указать TargetType для ControlTemplate, чтобы разрешались свойства, используемые в привязке шаблона.

Вот обновленный стиль с TargetType, указанным для ControlTemplate:

<Style x:Key="LabelHeader" TargetType="controls:Label">
    <Setter Property="Margin" Value="0" />
    <Setter Property="Opacity" Value=".6" />
    <Setter Property="VerticalAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="controls:Label">
                <Border BorderBrush="#CCCCCCCC" BorderThickness=".5" Background="#CCEFEFEF">
                    <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="2" Content="{TemplateBinding Content}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Однако разработчикам было бы очень полезно, если бы IDE / intellisense мог убедиться, что свойство, указанное в TemplateBinding, действительно существует в заданном по умолчанию / указанном TargetType ControlTemplate.

Источник: - обсуждение на форуме Silverlight .NET: (недостаточно репутации для публикации> 1 гиперссылки) - Моя проблема MS Connect: https://connect.microsoft.com/VisualStudio/feedback/details/561183

4 голосов
/ 24 мая 2010

В некоторых ситуациях в Silverlight 4 возникает ошибка, когда возникает это исключение. Это относится к свойству контента.

Временное исправление заключается в использовании обычной привязки для свойства Content.

Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"

Хотя я еще не тестировал это решение.

...