假设我想让一个TextBlock
的Width
等于它的父容器的Width
(即,从一边到另一边拉伸)或它的父容器Width
的一个百分比,我如何在不指定绝对值的情况下在XAML
中实现这一点?
我想这样做是为了如果父容器容器稍后被展开(它的‘Width
’增加了),它的‘子元素’也会自动展开。(基本上,就像HTML和CSS一样)
发布于 2009-04-04 08:24:11
将其拉伸到与父容器相同的大小的方法是使用属性:
<Textbox HorizontalAlignment="Stretch" ...
这将使Textbox元素水平拉伸,并水平填充所有父空间(实际上,这取决于您使用的父面板,但在大多数情况下应该都有效)。
百分比只能与网格单元格值一起使用,因此另一个选择是创建一个网格,并将您的文本框放入其中一个具有适当百分比的单元格中。
发布于 2009-04-04 08:04:34
您可以将文本框放在网格中,以对网格的行或列执行百分比值,并让文本框自动填充到其父单元格(默认情况下)。示例:
<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。
发布于 2009-04-04 08:35:35
通常,您将使用适合您的场景的内置布局控件(例如,如果您希望相对于父级进行缩放,则使用网格作为父级)。如果你想用一个任意的父元素来做这件事,你可以创建一个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>
https://stackoverflow.com/questions/717299
复制相似问题