Что эквивалентно Silverlight 3.0 для BasedOn = "{StaticResource {x: Type TextBlock}}" - PullRequest
5 голосов
/ 29 января 2010

Я пытаюсь расширить базовый стиль для TextBlock. Простое мышление в мире WPF должно быть таким же в Silverlight. Но я получаю сообщение об ошибке x: Type.

Как перевести BasedOn = "{StaticResource {x: Type TextBlock}}" в Silverlight. Кто-нибудь, кто достиг этого?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 29 января 2010

В Silverlight нет эквивалента этому конкретному использованию. Silverlight поддерживает только строковые ключи для доступа к ресурсам. Следовательно, использование {x:Type SomeType} в качестве ключа не работает.

В Silverlight вам нужно сделать полную копию стиля элементов управления. Вы можете сделать это либо с помощью Blend, у которого есть инструменты для этого, либо скопировав его из документации Silverlight. Стили управления и шаблоны

Конечно, когда у вас есть копия исходного стиля, вы можете изменить свою копию или создать другие стили, назначив эту копию для BasedOn, чтобы создать набор вариантов.

3 голосов
/ 20 апреля 2012

Я думаю, что это сработает, чтобы пойти немного назад, вы можете сделать свой базовый стиль

<Style TargetType="Button" x:Key="MyButtonStyle">
    <Setter Property="PropertyName" Value="PropertyValue" />
</Style>

тогда вы можете использовать все кнопки в этом стиле

<Style TargetType="Button" BasedOn="{StaticResource MyButtonStyle}" />

Тогда, если вам нужно добавить к этому стилю, вы можете просто основать его на названном стиле

<Style TargetType="Button" BasedOn="{StaticResource MyButtonStyle}">
    <Setter Property="PropertyName" Value="PropertyValue" />
</Style>

или

<Style TargetType="Button" BasedOn="{StaticResource MyButtonStyle}" x:Key="MyOtherButtonStyle">
    <Setter Property="PropertyName" Value="PropertyValue" />
</Style>
0 голосов
/ 06 июня 2015

Вы можете сделать это сейчас в Silverlight 5.

Сначала объявите свой стиль

<Style x:Key="TextBoxStyle" TargetType="TextBox" BasedOn="{local:Type TypeName=TextBox}">

</Style>

Затем вам нужно создать MarkupExtension, которое работает как в WPF, так и в Silverlight 5, чтобы заменить x: Тип

/// A MarkupExtension which introduces x:Type like syntax to both WPF and Silverlight (Cross-platform). This is used internally
/// for the themes, but is also useful e.g. when creating custom Control Templates for SciChart
/// </summary>
/// <remarks>
/// Licensed under the CodeProject Open License
/// http://www.codeproject.com/Articles/305932/Static-and-Type-markup-extensions-for-Silverlight
/// </remarks>
/// 
public class TypeExtension : MarkupExtension
{
    /// <summary>
    /// Initializes a new instance of the <see cref="TypeExtension" /> class.
    /// </summary>
    public TypeExtension()
    {
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="TypeExtension" /> class.
    /// </summary>
    /// <param name="type">The type to wrap</param>
    public TypeExtension(Type type)
    {
        Type = type;
    }

    /// <summary>
    /// Gets or sets the type information for this extension.
    /// </summary>
    public System.Type Type { get; set; }

    /// <summary>
    /// Gets or sets the type name represented by this markup extension.
    /// </summary>
    public String TypeName { get; set; }

    public override Object ProvideValue(IServiceProvider serviceProvider)
    {
        if (Type == null)
        {
            if (String.IsNullOrWhiteSpace(TypeName)) throw new InvalidOperationException("No TypeName or Type specified.");
            if (serviceProvider == null) return DependencyProperty.UnsetValue;

            IXamlTypeResolver resolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
            if (resolver == null) return DependencyProperty.UnsetValue;

            Type = resolver.Resolve(TypeName);
        }
        return Type;
    }
}

Протестировано как работающее в WPF и Silverlight

0 голосов
/ 29 января 2010

должно быть (и согласно Джесси Либерти )
BasedOn="{StaticResource TextBlock}"

...