将样式应用于大量项目的最佳方法是啥?
Posted
技术标签:
【中文标题】将样式应用于大量项目的最佳方法是啥?【英文标题】:What is the best approach for applying styles to massive amounts of items?将样式应用于大量项目的最佳方法是什么? 【发布时间】:2008-12-04 06:21:40 【问题描述】:在我的 LOB 应用程序中,我通常使用包含大量不同文本块和文本框的容器来供用户输入数据。通常我需要为每个控件应用一定的边距或垂直/水平对齐方式。
假设我的表单上有如下所示的 Grid(为简洁起见,删除了很多标记):
<Grid>
<Grid.ColumnDefinitions.../>
<Grid.RowDefinitions.../>
<TextBlock Text="MyLabel" />
<TextBox Text=Binding .../>
.
'
<!-- Repated a bunch more times along with all of the Grid.Row, Grid.Column definitions -->
</Grid>
现在假设我需要网格中包含的每个项目都具有 Margin="3,1" VerticalContentAlignment="Left" VerticalAlignment="Center"。有几种方法可以实现这一点:
-
直接在每个控件上设置属性 - 糟糕!不允许蒙皮或集中样式。
使用 x:Key="MyStyleName" 创建一个样式并将该样式应用于每个控件。更好...使集中样式和蒙皮更易于管理,但仍需要大量标记,并且可能变得笨拙。
创建一个全局样式(即不指定 x:Key 并设置 TargetType=x:Type TextBox/TextBlock - 不好!!这样做的问题是它会影响应用程序中所有不这样做的控件t 明确覆盖此样式。这对于菜单、网格和其他使用文本块和文本框的控件可能很糟糕。
创建一个以 Grid 为目标的样式并明确设置依赖属性值,如
<Setter Property="Frameworkelement.Margin" Value="3,1" />
不错...它正确地将样式应用于其内容中的每个元素,但也将其直接应用于 Grid 本身...不完全是我想要的。
那么你采取什么方法,为什么?什么效果最好?
【问题讨论】:
【参考方案1】:您可以将“全局”样式放入网格的Resources
部分,从而限制其影响。要在不同位置重用“全局”样式,请将它们放入非默认资源字典并将其包含为 MergedDictionary
:
在Styles.xaml
:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="x:Type ..."> ... </Style>
</ResourceDictionary>
形式:
<Grid>
<Grid.ColumnDefinitions.../>
<Grid.RowDefinitions.../>
<Grid.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- other resources here -->
</ResourceDictionary>
</Grid.Resources>
...
</Grid>
【讨论】:
【参考方案2】:您可以使用 #4,但随后在 Grid 本身上显式覆盖这些属性。
【讨论】:
【参考方案3】:看看这个。
http://karlshifflett.wordpress.com/2008/10/23/wpf-silverlight-lob-form-layout-searching-for-a-better-solution/
我发现它们对 LOB 应用程序有很大帮助。源代码可用,因此即使您不使用该库,您也可以了解如何进行全局样式设置。
【讨论】:
我曾经和 Karl 一起工作。我和他讨论过这个解决方案,但即使他也说他可能会采取不同的做法。【参考方案4】:这是我使用附加属性提出的解决方案:
Coding Context Article
【讨论】:
以上是关于将样式应用于大量项目的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章