创建水平自动滚动文本块时出现问题
本文关键字:问题 文本 水平 滚动 创建 | 更新日期: 2023-09-27 18:30:43
我正在尝试创建一个自动滚动文本块。
这是我到目前为止的代码:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="150" Width="400">
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="50"></ColumnDefinition>
</Grid.ColumnDefinitions>
<StackPanel Background="Red" Grid.Column="0" />
<StackPanel x:Name="UserContainer" Grid.Column="1">
<TextBlock x:Name="UserStatusLabel" TextWrapping="NoWrap" VerticalAlignment="Top"><Run Language="nl-nl" Text="Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."/>
<TextBlock.RenderTransform>
<TranslateTransform x:Name="translate" />
</TextBlock.RenderTransform>
<TextBlock.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation
From="{Binding ElementName=UserContainer, Path=Width}" To="-200"
Storyboard.TargetName="translate"
Storyboard.TargetProperty="X"
Duration="0:0:3"
AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</TextBlock.Triggers>
</TextBlock>
</StackPanel>
<StackPanel Background="Blue" Grid.Column="2" />
</Grid>
但我有3个问题:
- 文本应向左滚动到末尾。现在它停在某个点
- 文本不应穿过左侧的红色容器,也不应运行。
- 文本在某个点被切断,但我不知道为什么。
首先
,您需要将ClipToBounds="True"
添加到中央StackPanel
,以阻止文本在离开StackPanel
边界后显示。
其次,正如您所说,文本在"一定距离"处停止,因为您通过将DoubleAnimation
设置为仅移动到-200
来告诉它。我们需要将其替换为StackPanel.ActualWidth
属性的实际值:
<DoubleAnimation To="{Binding ActualWidth, ElementName=UserContainer}"
Storyboard.TargetName="translate" Storyboard.TargetProperty="X" Duration="0:0:3"
AutoReverse="True" />
但是,这会将文本移动到右边缘。我现在要给你这个作为答案,如果我能想到一种简单的方法来反转运动方向,我稍后会回来编辑它。
乌帕特>>>
好的,所以使文本向左移动的最简单方法是实现一个简单的Converter
:
public class AdditiveInverseDoubleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || value.GetType() != typeof(double) && targetType != typeof(double)) return false;
return -(double)value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || value.GetType() != typeof(double) && targetType != typeof(double)) return false;
return -(double)value;
}
}
然后更改 XAML:
<DoubleAnimation To="{Binding ActualWidth, ElementName=UserContainer, Converter={
StaticResource AdditiveInverseDoubleConverter}}" Storyboard.TargetName="translate"
Storyboard.TargetProperty="X" Duration="0:0:3" AutoReverse="True" />
不要忘记添加 XML 命名空间:
xmlns:Converters="clr-namespace:WpfApplication1.Converters"
Resource
:
<Window.Resources>
<Converters:AdditiveInverseDoubleConverter x:Key="AdditiveInverseDoubleConverter" />
</Window.Resources>
更新 2>>>
啊,我刚刚解决了...TextBlock
被切断,因为它不适合StackPanel
否则......放大StackPanel
可显示更多文本。但是,答案是不要使用StackPanel
,而是使用Canvas
......这将显示所有文本。
问题是,使用渲染转换,您只会转换已渲染的内容,并且此时文本已被剪切。LayoutTransform 忽略 TranslateTransform,因此您不能在此处使用它,但如果您使用的是 RotateTransform,您将看到其余文本出现。不确定如何使用渲染变换实现目标。
<TextBlock.LayoutTransform>
<RotateTransform x:Name="translate" />
</TextBlock.LayoutTransform>
<TextBlock.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation
From="0" To="90"
Storyboard.TargetName="translate"
Storyboard.TargetProperty="Angle"
Duration="0:0:3"
AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</TextBlock.Triggers>
编辑:边距动画呢,它的工作正常:
<ThicknessAnimation
Storyboard.TargetName="UserStatusLabel"
Storyboard.TargetProperty="Margin"
Duration="0:0:3" AutoReverse="True" From="0,0,0,0" To="-200,0,0,0" />