将样式应用于大量项目的最佳方法是什么?

时间:2008-12-04 06:21:41

标签: .net wpf styles

在我的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”。有几种方法可以实现这一目标:

  1. 直接在每个控件上设置属性 - 坏!不允许换肤或集中样式。
  2. 使用x:Key =“MyStyleName”创建样式,并将样式应用于每个控件。更好......使集中样式和皮肤更易于管理,但仍需要大量标记,并且可能变得笨拙。
  3. 创建一个全局样式(即不指定x:Key并设置TargetType = {x:Type TextBox / TextBlock} - BAD !!这个问题是它会影响应用程序中的所有控件t explicity覆盖了这种风格。这对于菜单,网格和其他使用文本块和文本框的控件都很糟糕。
  4. 创建一个以Grid为目标的样式,并明确地设置依赖性等值<Setter Property="Frameworkelement.Margin" Value="3,1" />不错......它正确地将样式应用于其内容中的每个元素,但也将其直接应用于Grid本身。 ..不完全是我想要的。
  5. 那你采取什么方法?为什么?什么效果最好?

4 个答案:

答案 0 :(得分:5)

您可以将“全局”样式放入网格的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>

答案 1 :(得分:0)

您可以使用#4,但然后在Grid本身上显式覆盖这些属性。

答案 2 :(得分:0)

检查一下。

http://karlshifflett.wordpress.com/2008/10/23/wpf-silverlight-lob-form-layout-searching-for-a-better-solution/

我发现它们对LOB应用程序有很大的帮助。源代码可用,因此即使您不使用库,也可以了解如何进行全局样式设置。

答案 3 :(得分:0)

这是我使用附加属性提出的解决方案:

Coding Context Article