WPF: установка ширины (и высоты) в процентах

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
142
задан Andrea Antonangeli 16 April 2018 в 14:48
поделиться

4 ответа

Способ расширить его к тому же размеру как родительский контейнер состоит в том, чтобы использовать атрибут:

 <Textbox HorizontalAlignment="Stretch" ...

Это заставит элемент Текстового поля простираться горизонтально и заполнить все родительское пространство горизонтально (на самом деле, это зависит от родительской панели, которую Вы используете, но должны работать на большинство случаев).

Проценты могут только использоваться со значениями ячейки сетки, таким образом, другая опция состоит в том, чтобы создать сетку и поместить Ваше текстовое поле в одну из ячеек с соответствующим процентом.

84
ответ дан 23 November 2019 в 22:51
поделиться

Можно поместить текстовые поля в сетке, чтобы сделать значения процента на строках или столбцах сетки и позволить текстовым полям автозаполниться к их родительским ячейкам (поскольку они будут по умолчанию). Пример:

<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.

206
ответ дан 23 November 2019 в 22:51
поделиться

Как правило, Вы использовали бы встроенное управление расположением, подходящее для Вашего сценария (например, использовали бы сетку в качестве родителя, если Вы хотите масштабироваться относительно родителя). Если Вы хотите сделать это с произвольным родительским элементом, можно создать 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>
54
ответ дан 23 November 2019 в 22:51
поделиться

Я знаю, что это не 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%), и простирается при необходимости.

4
ответ дан 23 November 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: