Применение стиля к дочерним элементам в Silverlight 4

#silverlight #styles

#silverlight #стили

Вопрос:

В Silverlight 4 (используя выражение Blend 4), как я могу изменить размер шрифта a TextBox в стиле Border содержащего его? Я конвертирую стиль из WPF в Silverlight (всегда весело). Вот что у меня есть:

 <Style x:Key="Title" TargetType="Border">
    <Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
    <Setter Property="TextBlock.TextAlignment" Value="Center"/>
    <Setter Property="TextBlock.FontSize" Value="48"/>
    <Setter Property="TextBlock.Foreground" Value="{StaticResource TextForeground}"/>
    <Setter Property="VerticalAlignment" Value="Top"/>
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="Background" Value="{StaticResource TitleBackground}"/>
    <Setter Property="Padding" Value="25,0"/>
</Style>
  

Это не работает. Это дает мне следующее исключение в конструкторе:
введите описание изображения здесь

Правки:

Хорошо, я знаю, что это возможно в WPF. Это просто невозможно в Silverlight (без использования всей конструкции темы, как предлагает Xin?)

Комментарии:

1. я не думаю, что это возможно сделать в Silverlight 4…

2. @Xin, не очень полезно, но честно. Спасибо 🙂

Ответ №1:

На самом деле вы могли бы получить то, что хотите, из тем silverlight toolkit. Вы можете найти это здесь (Тематизация -> Браузер тем).

Обновить:

Сначала вам нужно создать класс, который наследуется от темы (System.Windows.Элементы управления.Тематизация). Я в основном скопировал исходный код и переименовал его.

    /// <summary>
    /// Implicitly applies the border theme to all of its descendent
    /// FrameworkElements.
    /// </summary>
    /// <QualityBand>Preview</QualityBand>
    public class BorderTheme : Theme
    {
       /// <summary>
        /// Stores a reference to a Uri referring to the theme resource for the class.
        /// </summary>
        private static Uri ThemeResourceUri = new Uri("/theming;component/Theme.xaml", UriKind.Relative);

        /// <summary>
        /// Initializes a new instance of the ExpressionDarkTheme class.
        /// </summary>
        public BorderTheme()
            : base(ThemeResourceUri)
        {
            var a = ThemeResourceUri;
        }

        /// <summary>
        /// Gets a value indicating whether this theme is the application theme.
        /// </summary>
        /// <param name="app">Application instance.</param>
        /// <returns>True if this theme is the application theme.</returns>
        public static bool GetIsApplicationTheme(Application app)
        {
            return GetApplicationThemeUri(app) == ThemeResourceUri;
        }

        /// <summary>
        /// Sets a value indicating whether this theme is the application theme.
        /// </summary>
        /// <param name="app">Application instance.</param>
        /// <param name="value">True if this theme should be the application theme.</param>
        public static void SetIsApplicationTheme(Application app, bool value)
        {
            SetApplicationThemeUri(app, ThemeResourceUri);
        }
    }
  

Затем вам просто нужно создать словарь ресурсов и назвать его Theme.xaml, и поместить все ваши стили внутрь.

 <ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Style TargetType="Border"> 
    <Setter Property="VerticalAlignment" Value="Top"/>    
    <Setter Property="HorizontalAlignment" Value="Stretch"/>    
    <Setter Property="Background" Value="{StaticResource TitleBackground}"/>  
    <Setter Property="Padding" Value="25,0"/>
</Style>

<Style TargetType="TextBlock">
    <Setter Property="VerticalAlignment" Value="Center"/>    
    <Setter Property="TextAlignment" Value="Center"/>    
    <Setter Property="FontSize" Value="48"/>    
    <Setter Property="Foreground" Value="{StaticResource TextForeground}"/>
</Style> 
</ResourceDictionary>
  

И последнее, оберните им свою рамку!

     <local:BorderTheme>
        <Border>
            <TextBlock Text="TextBlock"/>
        </Border>
    </local:BorderTheme>
  

Вот и все. Вы должны быть в состоянии видеть стили, примененные к вашей границе, а также к вашему текстовому блоку. 🙂

Комментарии:

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