размер TextBox под содержимое
Пытаюсь сделать контрол для ввода времени.
<Grid>
<Border BorderThickness="0.5"
BorderBrush="Black"
HorizontalAlignment="Left">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0"
BorderThickness="0"
Text="{Binding Time.Hour, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ia:Interaction.Behaviors>
<local:TimeBehavior/>
</ia:Interaction.Behaviors>
</TextBox>
<TextBlock Text=":"
Grid.Column="1"/>
<TextBox Grid.Column="2"
BorderThickness="0">
<ia:Interaction.Behaviors>
<local:TimeBehavior/>
</ia:Interaction.Behaviors>
</TextBox>
<TextBlock Text=":"
Grid.Column="3"/>
<TextBox Grid.Column="4"
BorderThickness="0"
>
<ia:Interaction.Behaviors>
<local:TimeBehavior/>
</ia:Interaction.Behaviors>
</TextBox>
</Grid>
</Border>
</Grid>
Хотелось бы, чтобы размер TextBox был равным размеру под двузначное число. Ограничить в xaml не могу, так как шрифт может быть разным. Пробовал в TimeBehavior написать следующее
private void associatedObject_Loaded(object sender, RoutedEventArgs e)
{
var text = AssociatedObject.Text;
if (AssociatedObject.Text.Length < MaxChar)
{
AssociatedObject.Text = "99";
}
AssociatedObject.MinWidth = AssociatedObject.ActualWidth;
AssociatedObject.MaxWidth = AssociatedObject.ActualWidth;
AssociatedObject.Text = text;
}
Но это не сработало. Дайте наводку, как это можно сделать
Ответы (2 шт):
Автор решения: SullenMan
→ Ссылка
Так проблему с обновлением ActualWidth решил. После задания текста надо вызвать UpdateLayout(). Но теперь другая проблема - у Border не отрисовывается правая сторона.
Автор решения: aepot
→ Ссылка
Вот так вот просто
<TextBox Margin="5"
Text="{Binding Minutes, StringFormat=D2, UpdateSourceTrigger=PropertyChanged}"
Loaded="TextBox_Loaded"/>
Свойство
private int _minutes;
public int Minutes
{
get => _minutes;
set
{
if (value > 59)
_minutes = 59;
else if (value < 0)
_minutes = 0;
else
_minutes = value;
OnPropertyChanged();
}
}
Обработчик
private void TextBox_Loaded(object sender, RoutedEventArgs e)
{
TextBox textBox = sender as TextBox;
textBox.Width = textBox.ActualWidth;
}