彷徨的山楂 · Android中动态加载jar包 - 简书· 1 年前 · |
低调的水龙头 · html - Form Submit ...· 1 年前 · |
爱玩的馒头 · uniapp 调用安卓原生插件 ...· 1 年前 · |
耍酷的甘蔗 · python测试开发django-37.外键 ...· 1 年前 · |
爱搭讪的木瓜 · Oracle对视图有查询权限实际查询却报错O ...· 1 年前 · |
假设我想让一个
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" ...
这将使Textbox元素水平拉伸,并水平填充所有父空间(实际上,这取决于您使用的父面板,但在大多数情况下应该都有效)。
百分比只能与网格单元格值一起使用,因此另一个选择是创建一个网格,并将您的文本框放入其中一个具有适当百分比的单元格中。
通常,您将使用适合您的场景的内置布局控件(例如,如果您希望相对于父级进行缩放,则使用网格作为父级)。如果你想用一个任意的父元素来做这件事,你可以创建一个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,但我对textbox的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%),并在需要时进行拉伸。
我使用两种方法进行相对大小调整。我有一个名为
Relative
的类,它有三个附加的属性
To
,
WidthPercent
和
HeightPercent
,如果我想让一个元素在可视化树中的任何位置都是元素的相对大小,并且感觉没有转换器方法那么麻烦-尽管使用适合你的,你满意的方法,它是很有用的。
另一种方法更为巧妙。在需要相对大小的位置添加一个
ViewBox
,然后在其中添加一个宽度为100的
Grid
。如果你添加一个宽度为10的
TextBlock
,它显然是100的10%。
ViewBox
会根据给定的空间来缩放
Grid
,所以如果它是页面上的唯一内容,那么
Grid
将被扩展到全宽且有效,您的
TextBlock
将被缩放到页面的10%。
如果你不在
Grid
上设置高度,那么它会缩小以适应它的内容,所以它都是相对大小的。你必须确保内容不会变得太高,比如开始改变给
ViewBox
的空间的纵横比,否则它也会开始缩放高度。您可能可以使用
UniformToFill
的
Stretch
来解决此问题。
可以使用IValueConverter实现。从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>
彷徨的山楂 · Android中动态加载jar包 - 简书 1 年前 |