如何最好地为大量项目应用样式?(这是一个关于IT技术的问题)

3

在我的 LOB 应用程序中,我通常会使用容器来包含各种文本块和文本框,供用户输入数据。通常,我需要对每个控件应用一定的边距或垂直/水平对齐。

假设我在表单上有一个网格,看起来像这样(为了简洁起见省略了很多标记):

<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})-糟糕!!问题在于它会影响所有未明确覆盖此样式的应用程序中的控件。对于使用文本块和文本框的菜单、网格和其他控件来说,这可能是不好的。
  4. 创建一个针对网格的样式,并显式设置依赖属性值,如<Setter Property="Frameworkelement.Margin" Value="3,1" />还不错...它正确地将样式应用于其内容中的每个元素,但也直接将其应用于网格本身...这不是我想要的。
那么您会采取哪种方法?为什么?哪种方法最好?
4个回答

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>

0
你可以使用#4,但是在Grid本身上明确覆盖这些属性。

0

我曾经和卡尔一起工作过。我和他讨论了那个解决方案,但是即使他说他可能会用不同的方法来做。 - Micah

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接