我试图简化一些代码并提高可维护性。如何应用TextBox控件模板?
我最初正在寻找一种方法来让文本框左对齐,即可以缩小并展开到最大值,而不会在达到最大值后在网格单元格内居中。
于是我开始写一些像这样的代码...
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<TextBox Text="Some text"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Margin="10"
MaxWidth="150" />
</Grid>
(代码1)
而且能产生一些看起来像这样...
(图1)
正如您所看到的,这使TextBox以其最大宽度为中心,但它在网格单元的中心对齐。
于是我虽然也许如果我改变,像这样的文本框中的水平对齐方式...
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<TextBox Text="Some text"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Margin="10"
MaxWidth="100" />
</Grid>
(代码2)
但不幸的是,这仅产生看东西像这样...
(FIGUR e 2)
同样,这是不正确的,因为尽管所有在右侧的空白空间,文本框并没有扩大到我想要的最大宽度100。
最后,我发现如果将TextBox放入嵌套网格中,您将获得所需的效果。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"
MaxWidth="120" />
<ColumnDefinition Width="0*" />
</Grid.ColumnDefinitions>
<TextBox Text="Some text"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Margin="10"
MaxWidth="100" />
</Grid>
</Grid>
(代码3)
其中产量这...
(图3)
正如你所看到的,嵌套网格填充整个200宽的空间,但文本框填充左边10 0,并留下右侧的空白空间。 (如果重新可观的窗口就会缩小,适当扩大)
我想的代码3方法适用于样式或控件模板,这样我就可以毯子将其应用到文本框,其中这种情况适用。
在一个完美的场景中,我会做类似......
<TextBox Text="Some text"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Margin="10"
MaxWidth="100"
Style="{StaticResource ExpandingTextBox}" />
(代码4)
而达到相同的结果图3。
我尝试以下...
<Style TargetType="{x:Type TextBox}"
x:Key="ExpandingTextBox">
<Setter Property="OverridesDefaultStyle"
Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"
MaxWidth="170" />
<ColumnDefinition Width="0*" />
</Grid.ColumnDefinitions>
<ContentPresenter/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
(代码5)
但是,这只是使文本框从我的形式消失一起。我不擅长编写这样的模板,所以我有点不知所措。
另外,我刚刚意识到的一件事是嵌套列的宽度= MaxWidth + 2 x Margin。我不介意在TextBox声明中明确地设置列宽,但如果它可以是自动的,那就太棒了。
感谢您的帮助。用你写的东西,我确切地想出了我想要做什么并从那里扩展。请参阅下面的答案。 – imdandman 2013-04-26 16:12:23