在我的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"创建样式并将样式应用于每个控件 . 更好......使集中样式和皮肤更易于管理,但仍需要大量标记,并且可能变得笨拙 .
-
创建一个全局样式(即表达式覆盖此样式 . 这对于菜单,网格和其他使用文本块和文本框的控件这样做很糟糕 .
-
创建一个以Grid为目标的样式,并明确设置dependecy propety值,如
<Setter Property="Frameworkelement.Margin" Value="3,1" />
不错......它正确地将样式应用于其内容中的每个元素,但也将其直接应用于Grid本身......不完全是我的内容想 .
那么你采取什么方法?为什么?什么效果最好?
4 回答
您可以将"global"样式放入网格的
Resources
部分,从而限制其影响 . 要在不同位置重用"global"样式,请将它们放入非默认资源字典中并将其包含为MergedDictionary
:在
Styles.xaml
:形式如下:
您可以使用#4,但然后在Grid本身上显式覆盖这些属性 .
看一下这个 .
http://karlshifflett.wordpress.com/2008/10/23/wpf-silverlight-lob-form-layout-searching-for-a-better-solution/
我发现它们对LOB应用程序有很大的帮助 . 源代码可用,因此即使您不使用库,也可以了解如何进行全局样式设置 .
以下是我使用附加属性提出的解决方案:
Coding Context Article