设置第一列的宽度等于网格的宽度减去xaml

时间:2016-04-17 08:50:47

标签: wpf xaml datatemplate controltemplate resourcedictionary

如何设置第一列的宽度等于网格的宽度减去XAML中第二列的宽度?我需要这样做,因为我会用铅笔制作自定义TextBox

我的资源字典中的代码(在我的问题的底部)给了我这个结果,我添加了一些案例。前四个是TextBox目前的情况。最后一个是我希望TextBox看起来如何。请注意,通过将文本设置为等于很多空格来暂时解决此问题。

(点击图片查看全屏)

在这里您可以看到上面图片的代码:

<TextBox Grid.Row="0" Margin="5" Text=""/>
<TextBox Grid.Row="1" Margin="5" Text="Plop"/>
<TextBox Grid.Row="2" Margin="5" Text="Ploperdeplop"/>
<TextBox Grid.Row="3" Margin="5" Text="Ploperdeploperdeploperdeplop"/>
<TextBox Grid.Row="4" Margin="5" Text="                                             ">

另请注意,下面ControlTemplate中的第一列必须延伸到Grid个洞。如果ControlTemplate的宽度为150px,第二列(带铅笔的列)为50px,则第一列(带TextBox的列)的宽度必须为100px。如果网格为300px且第二列再次相同(50px),则第一列的宽度必须为250px。

这是您资源词典的一部分。

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Foreground" Value="#FF333333"/>
    <Setter Property="Background" Value="White"/>
    <Setter Property="Padding" Value="5"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
                    <VisualStateManager.VisualStateGroups...>

                    <Grid x:Name="grdRoot" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="Stretch">

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/> <!-- this column (index zero) must have a width of the width of the grid minus the second column (index one)-->
                            <ColumnDefinition Width="auto"/>
                        </Grid.ColumnDefinitions>

                        <TextBox x:Name="txbText" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TextBox}}, Path=Text}" Style="{x:Null}" BorderBrush="{x:Null}" 
                                 Grid.Column="0" Focusable="{TemplateBinding Focusable}" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch"/>

                        <Button x:Name="btnPencil" Grid.Column="1"  Focusable="False" HorizontalAlignment="Left" Margin="3,0,3,0" Grid.Row="0"  VerticalAlignment="Top" Width="20">
                            <Button.Content>
                                <fa:ImageAwesome Icon="Pencil"/>
                            </Button.Content>
                        </Button>

                    </Grid>
                </Border>
                <ControlTemplate.Triggers...>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

(代码中的...表示该部分已折叠)

2 个答案:

答案 0 :(得分:3)

grdRoot Horizo​​ntalAlignment绑定到TextBox Horizo​​ntalContentAlignment,默认为Left。将Horizo​​ntalAlignment更改为Stretch以获得所需的效果

<Grid x:Name="grdRoot" 
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">

稍后我将对txbText元素

应用Horizo​​ntalContentAlignment
<TextBox x:Name="txbText" 
         HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" ...

答案 1 :(得分:0)

来自@ASh的评论我通过将HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"更改为HorizontalAlignment="Strech" grdRoot来解决了我的问题。