function currencyFormat (num) {
return "$" + num.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
}
console.info(currencyFormat(2665)); // $2,665.00
console.info(currencyFormat(102665)); // $102,665.00
Способ расширить его к тому же размеру как родительский контейнер состоит в том, чтобы использовать атрибут:
<Textbox HorizontalAlignment="Stretch" ...
Это заставит элемент Текстового поля простираться горизонтально и заполнить все родительское пространство горизонтально (на самом деле, это зависит от родительской панели, которую Вы используете, но должны работать на большинство случаев).
Проценты могут только использоваться со значениями ячейки сетки, таким образом, другая опция состоит в том, чтобы создать сетку и поместить Ваше текстовое поле в одну из ячеек с соответствующим процентом.
Можно поместить текстовые поля в сетке, чтобы сделать значения процента на строках или столбцах сетки и позволить текстовым полям автозаполниться к их родительским ячейкам (поскольку они будут по умолчанию). Пример:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="3*" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" />
<TextBox Grid.Column="1" />
</Grid>
Это сделает № 1 2/5 из ширины и № 2 3/5.
Как правило, Вы использовали бы встроенное управление расположением, подходящее для Вашего сценария (например, использовали бы сетку в качестве родителя, если Вы хотите масштабироваться относительно родителя). Если Вы хотите сделать это с произвольным родительским элементом, можно создать ValueConverter, делают это, но это, вероятно, не будет вполне столь чисто, как Вы хотели бы. Однако при абсолютной необходимости в нем Вы могли бы сделать что-то вроде этого:
public class PercentageConverter : IValueConverter
{
public object Convert(object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
return System.Convert.ToDouble(value) *
System.Convert.ToDouble(parameter);
}
public object ConvertBack(object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Который может использоваться как это, для получения дочернего текстового поля 10% ширины его родительского холста:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<local:PercentageConverter x:Key="PercentageConverter"/>
</Window.Resources>
<Canvas x:Name="canvas">
<TextBlock Text="Hello"
Background="Red"
Width="{Binding
Converter={StaticResource PercentageConverter},
ElementName=canvas,
Path=ActualWidth,
ConverterParameter=0.1}"/>
</Canvas>
</Window>
Я знаю, что это не Xaml, но я сделал то же самое с событием SizeChanged текстового поля:
private void TextBlock_SizeChanged(object sender, SizeChangedEventArgs e)
{
TextBlock textBlock = sender as TextBlock;
FrameworkElement element = textBlock.Parent as FrameworkElement;
textBlock.Margin = new Thickness(0, 0, (element.ActualWidth / 100) * 20, 0);
}
Текстовое поле, кажется, 80% размером, он - родитель (хорошо поле правой стороны составляет 20%), и простирается при необходимости.