TextBox のサイズ変更を許可しますが、ユーザー入力によって拡大しないようにします
質問
次のようにウィンドウ内に TextBox を定義しています。
<Window x:Class="NS.MainWindow"
...
SizeToContent="WidthAndHeight">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition MinWidth="200" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MinHeight="50" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>
<TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
</Grid>
</Window>
問題は、ユーザーが TextBox に入力すると、MinWidth のみが設定されているため、テキスト ボックスが右に拡張されてしまうことです。私が本当に欲しいのは、次の行に折り返すテキストです。列の MinWidth を代わりに width に変更すると、これを行うことができます。ただし、これを行うと、ウィンドウのサイズが変更されたときに TextBox のサイズも変更されなくなります。
両方を取得できる方法はありますか?(すなわち、ウィンドウのサイズ変更時にのみサイズ変更、それ以外の場合は折り返す)
解決
この動作が発生する理由は、 ウィンドウの SizeToContent プロパティ - これは基本的に、コンテンツによって要求されたサイズに基づいてウィンドウ自体のサイズを変更することを許可します。したがって、さらに多くの内容を入力すると、テキストボックスに「もっとスペースが必要です」と表示され、ウィンドウが素直に拡大します。SizeToContent プロパティを設定しない場合、テキスト ボックスは拡大されません。
したがって、SizeToContent プロパティ セッターを削除し、比例グリッド サイズ設定を使用すると思います。ここでは、Column#2 を Column#1 の 2 倍の幅にすると言います。グリッドの horizontalAlignment とverticalAlignment のデフォルトの「Stretch」値により、ウィンドウのサイズ変更に合わせてコントロールのサイズも正しく変更されます。
<Window ...
Title="MyWindow" WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip"
MinWidth="300" Width="300" Height="80">
<Grid x:Name="myGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" MinWidth="100"/>
<ColumnDefinition Width="2*" MinWidth="200" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MinHeight="50" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>
<TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow"/>
</Grid>
SizeToContent プロパティ セッターを上記のコード スニペットに追加するだけだと...テキストボックスが最初はテキストコンテンツに合わせて拡大するという奇妙な動作が見られるでしょう。ただし、ウィンドウのサイズを一度変更すると...テキストボックスの拡大が停止します。奇妙な...その行動を説明することはできません。
HTH
他のヒント
WPFのTextBoxにはそのオプションが組み込まれていないようです。
この問題を解決するには、目的の(0、0)サイズを報告するカスタムTextBoxを使用できます。いハックですが、動作します。
MainWindow.xaml.csファイル内:
namespace NS
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
...
}
// Ugly HACK because the regular TextBox doesn't allow autoresize to fit the parent but NOT autoresize when the text doesn't fit.
public class TextBoxThatDoesntResizeWithText : TextBox
{
protected override Size MeasureOverride(Size constraint)
{
return new Size(0, 0);
}
}
}
次に、MainWindow.xamlファイルで:
<Window x:Class="NS.MainWindow"
...
xmlns:local="clr-namespace:NS"
SizeToContent="WidthAndHeight">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition MinWidth="200" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MinHeight="50" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>
<local:TextBoxThatDoesntResizeWithText Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
</Grid>
</Window>
2番目のColumnDefinitionをWidth =&quot; *&quot;に変更します。