我試圖簡化一些代碼並提高可維護性。如何應用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