2017-12-22 14 views
3

私のXAMLでは、ある程度の水平スペースがあります。その中には、(長さが不明な)テキストとそれに続くボタンを置く必要があります。ボタンはテキストの直後に配置する必要があります。私は、次のXAMLを使用しています:TextBlock内のテキストが短い場合WPFグリッドサイジングAuto vs Star

<Border Name="Boundaries" MaxWidth="500" MinWidth="500" Height="20"> 
     <Grid> 
     <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Grid.Column="0" TextTrimming="CharacterEllipsis"> 
       Lorem ipsum dolor sit amet, pri ex option legendos. Ludus solet at mel, facilisis urbanitas nam ad. 
      </TextBlock> 
     <Button Grid.Column="1">Button</Button> 
    </Grid> 
</Border> 

すべてが正常に動作し、テキストが十分に長い場合ただし、TextBlockのは、親要素とボタンは表示されませんオーバーフローします。これを修正するために、最初の列定義の幅を*に設定することができますが、これはボタンが常に右側にあることを意味します(テキストは単一ワードですが、テキストの直後にしたい)。

過去の私は、親のActualSizeから最初の列定義トラフコンバータのMaxWidthを設定することで同様の問題を解決しましたが、これはかなり複雑で非常に信頼性がありません。

このような基本レイアウト要件はWPFの一部であると思われますが、何も見つかりませんでした。何か不足していますか? enter image description here

+0

使用のStackPanel:水平、またはWrapPanel – sTrenat

答えて

4

あなたはこれを達成するためにDockPanelを使用することができます。

は、私はこのような何かをしたいです。あなたはレイアウトのサイズを取得するために列を使用する必要がありますが、実際のレイアウトの列を使用していない所定の大きさを強制せずにこれを行うには

<Border Name="Boundaries" MaxWidth="500" MinWidth="500" Height="20"> 
    <DockPanel HorizontalAlignment="Left" LastChildFill="False"> 
     <Button DockPanel.Dock="Right">Button</Button> 
     <TextBlock DockPanel.Dock="Right" TextTrimming="CharacterEllipsis"> 
      Lorem ipsum dolor sit amet, pri ex option legendos. Ludus solet at mel, facilisis urbanitas nam ad. 
     </TextBlock> 
    </DockPanel> 
</Border> 
+0

私は分遅刻のように見える:) –

+1

@appaイップ・イップあなたはそれを削除する前に、あなたの答えを見ました。どのようにStackPanelを使ってこれを行うことができますか? –

+0

@PaoloGo投稿した後、私は 'StackPanel'を使うことがはるかに複雑になることに気づきました。 'TextBlock'に無限のスペースを与えるので、' Button'にいくらかのスペースを残すために 'MaxWidth'(' StackPanel'の 'Width'に基づいて)を設定する必要があります。 –

0

:ような何か。 2つの列を追加し、TextBlockのサイズを取得するために使用できる最初の列に境界線を配置します。この例では、2番目の列の幅をボタンの幅にバインドします。この方法で、ボタンのテキストを変更しても機能します。オリエンテーションと

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="{Binding ElementName=mybutton, Path=ActualWidth}" /> 
     </Grid.ColumnDefinitions> 
     <Border Grid.Column="0" Name="myborder"/> 

     <StackPanel Orientation="Horizontal" Grid.ColumnSpan="2"> 
      <TextBlock MaxWidth="{Binding ElementName=myborder, Path=ActualWidth}" Text="test text" TextTrimming="CharacterEllipsis"/> 
      <Button Name="mybutton" Content="button" /> 
     </StackPanel> 
    </Grid> 
関連する問題