wpf 文本块,最大高度 - 首选宽度
wpf textblock, maximum height - prefered width
对于 wpf 中的文本块,可以(轻松地)设置最小值、最大值和实际值 width/height。
现在,就我而言,我有一个文本块,其中可能包含相当多的信息。哪个可以缠绕。我希望该信息包含在指定的 "line" - 最大高度上。然而,文本块也应遵守 "prefered" 宽度 - 如果需要,宽度可以增加。
因此:第一个单词换行并在保持宽度的同时增加高度。然后一旦高度达到一定值,停止增长并开始加宽。
我目前拥有的是(为 TextBlock
和 TextWrapping
导入相关库):
var tb = new TextBlock
tb.TextWrapping = TextWrapping.Wrap;
tb.Width = 96;
tb.MaxHeight = 96;
显然这只是 "fixes" Width
,其中高度刚刚增长到最大值之后文本刚刚溢出。
我想我理解正确。
标记
<Grid>
<TextBlock x:Name="Tb"
MinWidth="120" MaxWidth="120" MinHeight="23" MaxHeight="100"
TextWrapping="Wrap"
SizeChanged="TextBlock_SizeChanged_1"
Background="#FFEAC9C9"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="28,9,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
</Grid>
代码
private void TextBlock_SizeChanged_1(object sender, SizeChangedEventArgs e)
{
TextBlock tb = sender as TextBlock;
if (tb.ActualHeight >= tb.MaxHeight)
tb.MaxWidth += 300;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Tb.Text += DateTime.Now.ToString();
}
您可能正在寻找这样的行为者:
public class TextBlockBehavior : Behavior<TextBlock>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SizeChanged += AssociatedObject_SizeChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.SizeChanged -= AssociatedObject_SizeChanged;
}
private void AssociatedObject_SizeChanged(object sender, SizeChangedEventArgs e)
{
TextBlock temp = new TextBlock()
{
Text = AssociatedObject.Text,
LineStackingStrategy = AssociatedObject.LineStackingStrategy,
LineHeight = AssociatedObject.LineHeight,
TextTrimming = TextTrimming.None,
TextWrapping = AssociatedObject.TextWrapping,
Height = AssociatedObject.Height
};
double maxwidth = AssociatedObject.MaxWidth - 10;
double desiredHeight = double.PositiveInfinity;
while (desiredHeight > AssociatedObject.MaxHeight)
{
temp.Measure(new Size(maxwidth, double.PositiveInfinity));
maxwidth += 10;
desiredHeight = temp.DesiredSize.Height;
}
AssociatedObject.MaxWidth = maxwidth;
}
}
请注意,临时 TextBlock 是根据当前最大宽度测量的。使用其所需的大小,我们可以决定是增加最大宽度还是什么都不做。
您应该设置 MaxHeight
和 MaxWidth
属性。测试:
<TextBlock MaxHeight="50" MaxWidth="100" Background="Red" TextTrimming="None" TextWrapping="Wrap" MouseDown="TextBlock_MouseDown">
<i:Interaction.Behaviors>
<local:TextBlockBehavior />
</i:Interaction.Behaviors>
</TextBlock>
和代码:
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
((TextBlock)sender).Text += "AAAA ";
}
您可能需要在克隆文本块或更改逻辑或更改步长时进行一些更改(我在这里选择 10 pts)。
对于 wpf 中的文本块,可以(轻松地)设置最小值、最大值和实际值 width/height。
现在,就我而言,我有一个文本块,其中可能包含相当多的信息。哪个可以缠绕。我希望该信息包含在指定的 "line" - 最大高度上。然而,文本块也应遵守 "prefered" 宽度 - 如果需要,宽度可以增加。
因此:第一个单词换行并在保持宽度的同时增加高度。然后一旦高度达到一定值,停止增长并开始加宽。
我目前拥有的是(为 TextBlock
和 TextWrapping
导入相关库):
var tb = new TextBlock
tb.TextWrapping = TextWrapping.Wrap;
tb.Width = 96;
tb.MaxHeight = 96;
显然这只是 "fixes" Width
,其中高度刚刚增长到最大值之后文本刚刚溢出。
我想我理解正确。
标记
<Grid>
<TextBlock x:Name="Tb"
MinWidth="120" MaxWidth="120" MinHeight="23" MaxHeight="100"
TextWrapping="Wrap"
SizeChanged="TextBlock_SizeChanged_1"
Background="#FFEAC9C9"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="28,9,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
</Grid>
代码
private void TextBlock_SizeChanged_1(object sender, SizeChangedEventArgs e)
{
TextBlock tb = sender as TextBlock;
if (tb.ActualHeight >= tb.MaxHeight)
tb.MaxWidth += 300;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Tb.Text += DateTime.Now.ToString();
}
您可能正在寻找这样的行为者:
public class TextBlockBehavior : Behavior<TextBlock>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SizeChanged += AssociatedObject_SizeChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.SizeChanged -= AssociatedObject_SizeChanged;
}
private void AssociatedObject_SizeChanged(object sender, SizeChangedEventArgs e)
{
TextBlock temp = new TextBlock()
{
Text = AssociatedObject.Text,
LineStackingStrategy = AssociatedObject.LineStackingStrategy,
LineHeight = AssociatedObject.LineHeight,
TextTrimming = TextTrimming.None,
TextWrapping = AssociatedObject.TextWrapping,
Height = AssociatedObject.Height
};
double maxwidth = AssociatedObject.MaxWidth - 10;
double desiredHeight = double.PositiveInfinity;
while (desiredHeight > AssociatedObject.MaxHeight)
{
temp.Measure(new Size(maxwidth, double.PositiveInfinity));
maxwidth += 10;
desiredHeight = temp.DesiredSize.Height;
}
AssociatedObject.MaxWidth = maxwidth;
}
}
请注意,临时 TextBlock 是根据当前最大宽度测量的。使用其所需的大小,我们可以决定是增加最大宽度还是什么都不做。
您应该设置 MaxHeight
和 MaxWidth
属性。测试:
<TextBlock MaxHeight="50" MaxWidth="100" Background="Red" TextTrimming="None" TextWrapping="Wrap" MouseDown="TextBlock_MouseDown">
<i:Interaction.Behaviors>
<local:TextBlockBehavior />
</i:Interaction.Behaviors>
</TextBlock>
和代码:
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
((TextBlock)sender).Text += "AAAA ";
}
您可能需要在克隆文本块或更改逻辑或更改步长时进行一些更改(我在这里选择 10 pts)。