你好
我是 WPF 的新手,我正在寻找一种在 WPF 应用程序中滚动文本的解决方案,
我尝试了一些动画,但我遇到了剪辑问题
我在以下位置找到了可能解决我的问题的方法:
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/8330696e-7715-479e-8027-8d9925579a17/
但我不清楚变量 TranslateTransformName、scrollfactor 和 tt 应该是什么..
有人可以看看代码并帮我弄清楚吗?
谢谢
沃利
这是那里的代码: 代码块
<p class=MsoNoSpacing><
<span class=SpellE>Viewbox</span>
<span class=SpellE>OpacityMask</span> ="{x
<span
class=GramE>:Null</span> }"
<span class=SpellE>HorizontalAlignment</span> ="Center"
<span class=SpellE>VerticalAlignment</span> ="Stretch"
Width="Auto" Height="Auto"
<span class=SpellE>RenderTransformOrigin</span> ="0.5,0.5"
x:Name="container" Stretch="Uniform"
<span class=SpellE>StretchDirection</span> ="Both">
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'></span> <
<span
class=SpellE>Viewbox.RenderTransform</span> >
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'></span> <
<span
class=SpellE>TransformGroup</span> >
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> <
<span class=SpellE>ScaleTransform</span>
<span class=SpellE>ScaleX</span> ="1"
<span class=SpellE>ScaleY</span> ="1"/>
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> <
<span class=SpellE>SkewTransform</span>
<span class=SpellE>AngleX</span> ="0"
<span class=SpellE>AngleY</span> ="0"/>
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> <
<span class=SpellE>RotateTransform</span> Angle="0"/>
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> <
<span class=SpellE>TranslateTransform</span> X="640"
Y="0"/>
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'></span> </
<span
class=SpellE>TransformGroup</span> >
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'></span> </
<span
class=SpellE>Viewbox.RenderTransform</span> >
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'></span> <
<span
class=SpellE>TextBlock</span>
<span class=SpellE>RenderTransformOrigin</span> ="0.5
<span
class=GramE>,0.5</span> "
<span class=SpellE>HorizontalAlignment</span> ="Center"
x:Name="
<span class=SpellE>tb</span> "
<span class=SpellE>VerticalAlignment</span> ="Center"
Width="Auto" Height="Auto"
<span class=SpellE>FontSize</span> ="50"
<span class=SpellE>TextWrapping</span> ="
<span class=SpellE>NoWrap</span> "
Background="{x:Null}" Foreground="#FFFFFFFF"
Padding="0,0,0,10" Text="0">
</p>
<p class=MsoNoSpacing></p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'></span> <
<span
class=SpellE>TextBlock.RenderTransform</span> >
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> <
<span class=SpellE>TransformGroup</span> >
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> <
<span class=SpellE>ScaleTransform</span>
<span class=SpellE>ScaleX</span> ="1"
<span class=SpellE>ScaleY</span> ="1"/>
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> <
<span class=SpellE>SkewTransform</span>
<span class=SpellE>AngleX</span> ="0"
<span class=SpellE>AngleY</span> ="0"/>
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> <
<span class=SpellE>RotateTransform</span> Angle="0"/>
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> <
<span class=SpellE>TranslateTransform</span> X="640"
Y="0"/>
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'>
</span> </
<span class=SpellE>TransformGroup</span> >
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'></span> </
<span
class=SpellE>TextBlock.RenderTransform</span> >
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'></span> </
<span
class=SpellE>TextBlock</span> >
</p>
<p class=MsoNoSpacing>
<span style='mso-spacerun:yes'></span> </
<span
class=SpellE>Viewbox</span> >
</p>
<p class=MsoNoSpacing>
<o:p> </o:p>
</p>
<p class=MsoNoSpacing>
<o:p> </o:p>
</p>
<p class=MsoNoSpacing>
<o:p> </o:p>
</p>
<p class=MsoNoSpacing>
<o:p> </o:p>
</p>
代码块 private void StartAnimation(object sender, EventArgs e) { tb.Text = 新闻;
MainWindow.UpdateLayout();
Double timeToTake = (MainWindow.Width + tb.ActualWidth) / scrollfactor;
this.tb.RenderTransform = tt;
Storyboard sb = new Storyboard();
DoubleAnimation daX = new DoubleAnimation(MainWindow.Width, (0.0 - tb.ActualWidth), new Duration(TimeSpan.FromSeconds(timeToTake)));
daX.RepeatBehavior = RepeatBehavior.Forever;
Storyboard.SetTargetName(daX, TranslateTransformName);
Storyboard.SetTargetProperty(daX, new PropertyPath(TranslateTransform.XProperty));
sb.Children.Add(daX);
sb.Begin(this.tb);
}
最佳答案
这是一个完整的示例 - 已验证它是否有效。我修改了source posted here by Philipsh (对控件布局进行细微更改以使其更美观)
我有点跳过了 WPF 编程中的动画章节。所以我无法解释它是如何工作的……这本书不在手边。如果我尝试发布答案,我最多只能猜测..
XAML
<Window x:Class="transforms.Window1"
Title="Window2" SizeToContent="WidthAndHeight">
<DockPanel>
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
<TextBox x:Name="txtTexttoScroll">Enter some text to marquee</TextBox>
<Button x:Name="button1" Click="button1_Click">Start Scrolling</Button>
</StackPanel>
<Canvas Name="canvas1" Height="32" ClipToBounds="True" Background="AliceBlue" Width="200">
<TextBlock Canvas.Left="0" Canvas.Top="0" Height="31" Name="textBlock1" Width="{Binding ElementName=canvas1, Path=ActualWidth}" Text="Have a nice day!" FontSize="18.6666666666667" TextWrapping="NoWrap" VerticalAlignment="Center">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform x:Name="rtTTransform"/>
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
</DockPanel>
</Window>
按钮点击事件处理器
private void button1_Click(object sender, RoutedEventArgs e)
{
double textBoxWidth = 10;
double pixelXFactor;
double canvaswidth = this.canvas1.Width;
double negXOffSet = 0;
double fromSecValue = 0;
double equSlope = 0.022546419;
double offSetY = 10.96286472;
double stringSize;
int textLen = txtTexttoScroll.Text.Length;
//Set the width of the text box according to the width (not length) of the text in it.
System.Globalization.CultureInfo enUsCultureInfo;
Typeface fontTF;
FormattedText frmmtText;
if (textLen > 0)
{
enUsCultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-us");
fontTF = new Typeface(this.textBlock1.FontFamily, this.textBlock1.FontStyle, this.textBlock1.FontWeight, this.textBlock1.FontStretch);
frmmtText = new FormattedText(txtTexttoScroll.Text, enUsCultureInfo, FlowDirection.LeftToRight, fontTF, this.textBlock1.FontSize, this.textBlock1.Foreground);
stringSize = frmmtText.Width;
if (stringSize < 100)
pixelXFactor = 1.02;
else
pixelXFactor = 1.01;
textBoxWidth = stringSize * pixelXFactor;
this.textBlock1.Width = textBoxWidth;
negXOffSet = textBoxWidth * -1;
fromSecValue = (stringSize * equSlope) + offSetY;
this.textBlock1.Text = txtTexttoScroll.Text;
Storyboard _sb = new Storyboard();
Duration durX = new Duration(TimeSpan.FromSeconds(fromSecValue));
DoubleAnimation daX = new DoubleAnimation(canvaswidth, negXOffSet, durX);
daX.RepeatBehavior = RepeatBehavior.Forever;
Storyboard.SetTargetName(daX, "rtTTransform");
Storyboard.SetTargetProperty(daX, new PropertyPath(TranslateTransform.XProperty));
_sb.Children.Add(daX);
_sb.Begin(this.textBlock1);
}
else
{
textBoxWidth = 1;
stringSize = 0;
}
关于c# - 如何在 WPF textBlock 控件中滚动文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/668869/