2011-07-28 14 views
7

で水平拡張するのテキストボックスには、私は私のApp.xaml防止WPF

<Style x:Key="textBoxMultiline" TargetType="{x:Type TextBox}" > 
    <Setter Property="VerticalScrollBarVisibility" Value="Auto" /> 
    <Setter Property="HorizontalScrollBarVisibility" Value="Hidden" /> 
    <Setter Property="MinHeight" Value="50" /> 
    <Setter Property="TextWrapping" Value="Wrap" /> 
</Style> 

にと簡単なテキストを必要とするすべてのテキストボックスに、我々はそれを使用しているソリューション全体で定義された次のスタイルを持っています。

<TextBox x:Name="textBoxDescription" Grid.Row="2" Grid.Column="1" Style="{DynamicResource textBoxMultiline}" /> 

すべてが素晴らしい作品が、その後、クライアントはいくつかのフィールド文句は低解像度の古いモニターでcorpedので、私はcorpingを防ぐために、高いビジュアルツリーノードのいずれかにScrollViewerを配置しました。

<ScrollViewer Height="Auto" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
    ... 
</ScrollViewer> 

不思議なことに、上記のスタイルでTextBox ES代わりにテキストをラップの右側に拡大し始めます。

ScrollViewerを削除せずにこれを防ぐ方法はありますか?

答えて

4

TextBoxにはMaxWidthを定義する必要があります。それ以外の場合は、ScrollViewerという制限がありません。

+0

HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" 

を追加することができます。私はちょっと、固定幅のものを組み込むためにテキストボックステンプレートをオーバーライドし、その新しい要素幅にtextBox actualwidthをバインドするような、より汎用的なソリューションを探していました。これはたくさんの勇気がかかっているようですが、私はTextBoxスタイルの変更だけを進化させるものを探していました。 – dcarneiro

+0

あなたがやっていることはやや矛盾しています。テキストボックスの幅が制限されている場合は、無制限の水平スペースを持つスクロールビューア内に配置します( "自動")。あなたはそれを解決するかもしれませんが、一般的な方法はありません。 scrollviewerのActualWidthとテキストボックスの(最大)幅からバインディングを作成する必要があります。問題は、オフセットと他のものを考慮に入れるためにコンバータを追加する必要があることです(私にとっては非常に面倒です)。 –

+0

低解像度の画面で他のコントロールがトリミングされたため、水平スクロールバーがハックしていました。私はテキストボックスの幅を同じ幅の要素(同じスタイルで同じグリッドセルの別のテキストボックスが隠されている)にバインドしようとしましたが、うまくいきました。しかし、私は、テキストをラップするのではなく、情報がどこにあるTextBlockも水平方向に拡大することを発見しました。これは、水平スクロールバーがTextWrappingプロパティよりも優先されることを示しています。だから私は低画面解像度をサポートするためにUIを再設計しなければならないと思う。 – dcarneiro

7

あなたは幅ハードコードにしたくないなら、あなたは親アイテムの幅を結合要素のために行くことができます...ここにここで私はscrolviewer実際の幅とテキストボックスのmaxWidthを結合していたサンプル

です。また、列定義の幅を "*"でなく "自動"に設定する必要があります。あなたはオートに設定している場合には、ScrollViewerの幅を無視し、ScrollViewerのと、テキストボックスの幅を拡大し続けます。.. 私はあなたがこの場合に落ちると思います....

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"></ColumnDefinition> 
      <ColumnDefinition Width="*"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <ScrollViewer HorizontalScrollBarVisibility="Auto" Name="scv"> 
      <TextBox Height="30" TextWrapping="Wrap" MaxWidth="{Binding ElementName=scv,Path=ActualWidth}"></TextBox> 
     </ScrollViewer> 
    </Grid> 
+1

悲しいことに、ScrollViewerとTextBoxの間にいくつかのVisualTreeItemがあり、それらは同じUserControlにさえいません。それにもかかわらず、まだマージン/パディングオフセットがあります。先祖のUserControlのHorizo​​ntal ResizingよりTextWrappingを優先させるのが本当の課題です。 – dcarneiro

4

から提供されたソリューション@ bathineniは私の問題を解決するのを助けました。ここに私のために働いたものです:

<Grid > 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="50"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
     <Button Grid.Column="0" Width="30" Height="23" Margin="10,5" Content="..."/> 
     <ScrollViewer Grid.Column="1" HorizontalScrollBarVisibility="Disabled" verticalScrollBarVisibility="Disabled" Name="scv"> 
      <TextBox Height="25" Text="Insert here long text" MaxWidth="{Binding ElementName=scv, Path=ActualWidth}" HorizontalAlignment="Stretch" /> 
     </ScrollViewer> 
    </Grid> 
0

私のために働いています。あなたはスクロールバーがテキストボックスに表示したい場合は、私は、異なる幅のテキストボックスでそのスタイルを使用しているテキストボックス