WPF: 폭(및 높이)을 퍼센티지 값으로 설정
Say I want a.TextBlock
그것을 가지다Width
상위 컨테이너와 같음Width
(즉, 좌우로 늘어짐) 또는 상위 컨테이너의 비율Width
를 사용하여 이를 실현하려면XAML
절대값을 지정하지 않고요?
상위 컨테이너 컨테이너가 나중에 확장될 경우(컨테이너 컨테이너의Width
(HTML 및 CSS와 같이 기본적으로)의 자 요소도 자동으로 확장됩니다.
그리드 내에 텍스트 상자를 배치하여 그리드의 행 또는 열에 백분율 값을 수행하고 텍스트 상자가 부모 셀에 자동으로 채워지도록 할 수 있습니다(기본적으로).예:
<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가 됩니다.
부모 컨테이너와 같은 크기로 확장하려면 다음 속성을 사용합니다.
<Textbox HorizontalAlignment="Stretch" ...
그러면 텍스트 상자 요소가 수평으로 늘어나고 모든 상위 공간이 수평으로 채워집니다(실제로 사용하는 상위 패널에 따라 다르지만 대부분의 경우 작동합니다).
백분율은 그리드 셀 값에만 사용할 수 있으므로 그리드를 만들고 적절한 백분율로 텍스트 상자를 셀 중 하나에 넣는 방법도 있습니다.
일반적으로 시나리오에 적합한 내장 레이아웃 컨트롤을 사용합니다(예를 들어 부모에 대해 상대적인 확장을 원하는 경우 그리드를 부모로 사용).임의의 부모 요소를 사용하여 작업을 수행할 경우 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>
"2*"와 같은 오류가 발생한 경우 문자열을 Length로 변환할 수 없습니다.
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" /><!--This will make any control in this column of grid take 2/5 of total width-->
<ColumnDefinition Width="3*" /><!--This will make any control in this column of grid take 3/5 of total width-->
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MinHeight="30" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0">Your text block a:</TextBlock>
<TextBlock Grid.Column="1" Grid.Row="0">Your text block b:</TextBlock>
</Grid>
IValue Converter 구현을 사용할 수 있습니다.IValueConverter에서 상속을 받는 Converter 클래스는 다음과 같은 파라미터를 취합니다.value
(백분율) 및parameter
(부모 너비) 및 원하는 너비 값을 반환합니다.XAML 파일에서 구성 요소의 너비는 원하는 값으로 설정됩니다.
public class SizePercentageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (parameter == null)
return 0.7 * value.ToDouble();
string[] split = parameter.ToString().Split('.');
double parameterDouble = split[0].ToDouble() + split[1].ToDouble() / (Math.Pow(10, split[1].Length));
return value.ToDouble() * parameterDouble;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
// Don't need to implement this
return null;
}
}
XAML:
<UserControl.Resources>
<m:SizePercentageConverter x:Key="PercentageConverter" />
</UserControl.Resources>
<ScrollViewer VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
Width="{Binding Converter={StaticResource PercentageConverter}, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Border}},Path=ActualWidth}"
Height="{Binding Converter={StaticResource PercentageConverter}, ConverterParameter=0.6, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Border}},Path=ActualHeight}">
....
</ScrollViewer>
상대적인 사이징에는 두 가지 방법을 사용합니다.나는 라는 수업이 있다.Relative
세 가지 성질이 붙어 있다To
,WidthPercent
★★★★★★★★★★★★★★★★★」HeightPercent
시각적인 트리에서 요소의 상대적인 크기가 되어 컨버터 접근법보다 덜 진부한 느낌이 드는 요소를 원하는 경우 유용합니다. - 비록 당신이 만족하는 것을 사용하지만.
하다ViewBox
안에 인 크기를 그 에 상대적인 크기를 .Grid
1001991.100cm입니다. 다음에 '이렇게'를 TextBlock
10%로 100%로 10%로 하다.
ViewBox
Grid
에 따라 " 공간", "이러한 공간", "이러한 공간", "이러한 공간", "이러한 공간", "이러한 공간", "이러한 공간", "이러한 공간"이 표시됩니다.Grid
되어,으로 「전폭」이 .TextBlock
10%로 하다
이를 on on 의 높이를 하지 않은 높이를 Grid
내용물에 맞게 줄어들기 때문에 크기가 상대적으로 커집니다.'어울리다', '어울리다', '어울리다', '어울리다', '어울리다', '어울리다'에 비율을 수 .ViewBox
그렇지 않으면 높이도 올라가기 시작합니다. '어느 정도'로 하면 될 것 같아요.Stretch
UniformToFill
.
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%)인 것으로 보이며 필요에 따라 늘어납니다.
언급URL : https://stackoverflow.com/questions/717299/wpf-setting-the-width-and-height-as-a-percentage-value
'programing' 카테고리의 다른 글
WPF 응용 프로그램의 기본 글꼴을 설정하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
---|---|
셸 스크립트의 16진수부터 10진수까지 (0) | 2023.04.14 |
현재 아이폰/디바이스 모델을 판별하는 방법 (0) | 2023.04.14 |
SQL 네트워크 인터페이스, 오류: 50 - 로컬 데이터베이스 런타임 오류가 발생했습니다.자동 인스턴스를 만들 수 없습니다. (0) | 2023.04.14 |
목록에서 여러 인덱스를 동시에 제거하려면 어떻게 해야 합니까? (0) | 2023.04.14 |