WPF TextBoxはStackPanelに入力しません


94

私が持っているTextBox内のコントロールStackPanelを持つOrientationに設定されているがHorizontal、残りのStackPanelのスペースを埋めるためにテキストボックスを取得することはできません。

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="180" Width="324">

    <StackPanel Background="Orange" Orientation="Horizontal" >
        <TextBlock Text="a label" Margin="5" VerticalAlignment="Center"/>
        <TextBox Height="25" HorizontalAlignment="Stretch" Width="Auto"/>
    </StackPanel>
</Window>

そして、これは次のようになります。

代替テキスト

そのTextBoxがStackPanelを満たさないのはなぜですか?

私はコントロールを使用することでより多くのコントロールを持つことができることを知っていますGrid、私はレイアウトについて混乱しています。

回答:


146

でも同じ問題がStackPanelあり、動作は「仕様」です。 StackPanel可視領域の外側でも「スタック」することを目的としているため、スタック次元の残りのスペースを埋めることはできません。

DockPanelwith LastChildFillset to trueを使用して、塗りつぶし以外のすべてのコントロールをにドッキングして、Left必要な効果をシミュレートできます。

<DockPanel Background="Orange" LastChildFill="True">
    <TextBlock Text="a label" Margin="5" 
        DockPanel.Dock="Left" VerticalAlignment="Center"/>
    <TextBox Height="25" Width="Auto"/>
</DockPanel >

7
明確にするために-LastChildFillはデフォルトで "True"に設定されており、TextBoxのHorizo​​ntalAlignmentをストレッチに設定しても効果はありません。:-)
ゴブリン

1
@Goblin:はい... OPのコードをコピーして貼り付けましたが、削除するのを忘れていましたHorizontalAlignment。:)
ザック・ジョンソン、

真剣に、これは設計によるものですか?コントロール自体が明らかに幅全体に広がっているので、奇妙に思われます。コンテンツ領域は表示領域と必ずしも同じではないということですか?
ハンク

1
@peter長い時間でのものWPF行っていないが、あなたは利用可能なスペース(取るために、最初の列セットとグリッドのいくつかの並べ替えを試みる場合がありますstackoverflow.com/questions/12432189/...を
ザック・ジョンソン

6
私は少し遅れて、ここでパーティにですが、@peter:あなたが使用することができますFlowDirection="RightToLeft"DockPanelあなたの最後の子は、残りのスペースを使用して、左のいずれかになりますので、。
Dennis

16

代わりにグリッドを使用することをお勧めします。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="180" Width="324">

    <Grid Background="Orange">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="a label" 
           VerticalAlignment="Center"/>
        <TextBox  Grid.Column="1"/>
    </Grid>
</Window>

この問題を回避するもう1つの方法は、ラベルを右ではなく上に重ねることです。UWPには、そのために使用できる組み込みのヘッダープロパティがあることに気付きました。WPFのヘッダープロパティが存在するかどうかはわかりません。

<TextBox Header="MyLabel" />

2

実際のトピック別の古い質問:

HorizontalAlignment="Stretch"

必要なものです。Justeは必ず削除してくださいwidth


1

以下を使用して、StackPanelにテキストボックスを入力できます。

<StackPanel Margin="5,5,5,5">
    <Label Content = "lblExample" Width = "70" Padding="0" HorizontalAlignment="Left"/>
    <TextBox Name = "txtExample" Text = "Example Text" HorizontalContentAlignment="Stretch"/>
</StackPanel>

スタックパネルを水平に埋めるテキストボックス


ええ、でも横型スタックパネルにはありません。あなたは垂直です:-)
JB。モニカと。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.