【问题标题】:Applying Style to child elements in Silverlight 4在 Silverlight 4 中将样式应用于子元素
【发布时间】:2011-08-13 06:47:57
【问题描述】:

在 Silverlight 4(使用 Expression Blend 4)中,如何在包含 Border 的样式中更改 TextBox 的字体大小?我正在将样式从 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 建议的整个主题构造?)

【问题讨论】:

  • 我认为在 Silverlight 4 中不可能做到这一点...
  • @Xin,不是很有帮助,但很诚实。谢谢:)

标签: silverlight styles


【解决方案1】:

实际上,您可以从 silverlight 工具包主题中获得您想要的东西。你可以找到它here (Theming -> Theme Browser)。

更新:

首先,您需要创建一个继承自 Theme (System.Windows.Controls.Theming) 的类。我基本上是从源代码中复制并重命名的。

   /// <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>

就是这样。您应该能够看到应用于边框和 TextBlock 的样式。 :)

【讨论】:

  • 我很困惑。这对我的情况有什么帮助。我想造一个时钟,而你给了我火箭飞船的蓝图。
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多