Я не уверен, почему, но я не смог заставить работать ScrollViewer Solution.Мне нужно было текстовое поле с фиксированной начальной шириной для реализации числового элемента управления вверх / вниз - в этом элементе управления текстовое поле уменьшалось и увеличивалось в зависимости от ввода, которое выглядит очень раздражающим, если пользовательский интерфейс изменяется при вводе.
Итак, я нашел следующее решение, используя 2 текстовых поля, чтобы работать для меня.Первое текстовое поле - это текстовое поле, отображаемое для ввода пользователем своего ввода, а 2-е текстовое поле инициализируется через свойство зависимости (DisplayLength) и преобразователь, показанный ниже.
Привязка свойства MaxWidth 1-го TextBox к свойству Width 2-го TextBox фиксирует размер так, что пользователи могут вводить то, что им нужно, но отображаемая ширина текстового поля не изменится, даже если будет больше места для интерфейсадоступно ...
<TextBox x:Name="PART_TextBox"
Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}"
Margin="0,0,1,0"
TextAlignment="Right"
AcceptsReturn="False"
SpellCheck.IsEnabled="False"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Center"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
MaxWidth="{Binding ElementName=TBMeasure, Path=ActualWidth}"
/>
<!-- Hidden measuring textbox ensures reservation of enough UI space
according to DisplayLength dependency property
-->
<TextBox x:Name="TBMeasure"
Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisplayLength, Converter={StaticResource ByteToPlaceHolderStringConverter}}"
Margin="0,0,1,0"
TextAlignment="Right"
AcceptsReturn="False"
SpellCheck.IsEnabled="False"
HorizontalContentAlignment="Right"
VerticalContentAlignment="Center"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Visibility="Hidden"/>
// Converter
[ValueConversion(typeof(byte), typeof(string))]
public sealed class ByteToPlaceHolderStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((value is byte) == false)
return Binding.DoNothing;
byte byteVal = (byte)value;
string retString = string.Empty;
for (int i = 0; i < byteVal; i++)
retString = retString + "X";
return retString;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}