GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG連續文本北京時間WPF中
我在WPF合作,創建一個文本股票。我可以永遠將文本從右向左移動,但我的問題是,我想要無縫地移動相同的文本以創建上述效果(就像股票交易所股票代碼一樣)。以上文字必須無止境地移動。
我該如何實現它?
GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG連續文本北京時間WPF中
我在WPF合作,創建一個文本股票。我可以永遠將文本從右向左移動,但我的問題是,我想要無縫地移動相同的文本以創建上述效果(就像股票交易所股票代碼一樣)。以上文字必須無止境地移動。
我該如何實現它?
所以從閱讀你的問題我不確定你想要什麼。你想要一個文本,滾動出文本框,並重新開始,像大多數選框控件/函數。
或者你想在文本框中反覆運行一些文本,從開始到結束填充它?然後用一個不可檢測的給定循環? :)
後面的代碼:
//單行動畫。
private void LeftToRightMarqueeOnTextBox()
{
string Copy = " "+TextBoxMarquee.Text;
double TextGraphicalWidth = new FormattedText(TextBoxMarquee.Text, System.Globalization.CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(TextBoxMarquee.FontFamily.Source), TextBoxMarquee.FontSize, TextBoxMarquee.Foreground).WidthIncludingTrailingWhitespace;
//BorderTextBoxMarquee.Width = TextGraphicalWidth + 5;
ThicknessAnimation ThickAnimation = new ThicknessAnimation();
ThickAnimation.From = new Thickness(TextBoxMarquee.ActualWidth, 0, 0, 0);
ThickAnimation.To = new Thickness(-TextGraphicalWidth, 0, 0, 0);
ThickAnimation.RepeatBehavior = RepeatBehavior.Forever;
ThickAnimation.Duration = new Duration(TimeSpan.FromSeconds(3));
TextBoxMarquee.BeginAnimation(TextBox.PaddingProperty, ThickAnimation);
}
OR
//語音復讀沒有間隙的動畫。
string Copy = " "+TextBoxMarquee.Text;
double TextGraphicalWidth = new FormattedText(Copy, System.Globalization.CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(TextBoxMarquee.FontFamily.Source), TextBoxMarquee.FontSize, TextBoxMarquee.Foreground).WidthIncludingTrailingWhitespace;
double TextLenghtGraphicalWidth = 0;
//BorderTextBoxMarquee.Width = TextGraphicalWidth + 5;
while (TextLenghtGraphicalWidth < TextBoxMarquee.ActualWidth)
{
TextBoxMarquee.Text += Copy;
TextLenghtGraphicalWidth = new FormattedText(TextBoxMarquee.Text, System.Globalization.CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(TextBoxMarquee.FontFamily.Source), TextBoxMarquee.FontSize, TextBoxMarquee.Foreground).WidthIncludingTrailingWhitespace;
}
TextBoxMarquee.Text += " "+TextBoxMarquee.Text;
ThicknessAnimation ThickAnimation = new ThicknessAnimation();
ThickAnimation.From = new Thickness(0, 0, 0, 0);
ThickAnimation.To = new Thickness(-TextGraphicalWidth, 0, 0, 0);
ThickAnimation.RepeatBehavior = RepeatBehavior.Forever;
ThickAnimation.Duration = new Duration(TimeSpan.FromSeconds(2));
TextBoxMarquee.BeginAnimation(TextBox.PaddingProperty, ThickAnimation);
XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Canvas ClipToBounds="True" Name="canMain" Background="Transparent">
<Grid Width="{Binding ElementName=canMain, Path=ActualWidth}" >
<Grid.ColumnDefinitions>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Name="TextBlockMarquee" Text="This is my animated text" />
<Border Grid.Row="1" BorderBrush="Black" BorderThickness="1">
<TextBox ClipToBounds="True" Name="TextBoxMarquee" Text="lars er en god skakspiller, der tænker længere end de andre" BorderBrush="Transparent"/>
</Border>
</Grid>
</Canvas>
</Grid>
基本上忽略大部分XAML的。最重要的是文本框中文本的長度。沒有找到一個通用的解決方案,這就是爲什麼我的厚度是基於數字的。
但只是要確保這是你要找的:)
編輯/ UPDATE:
所以現在嘗試一下,我已經更新了代碼..希望它作品,但從幾個測試看來,它似乎:)只有你需要確定的是整個文本框被填寫,然後我做了一個副本,我會循環兩個文本字符串圖形長度:)(
編輯/更新: 我已經添加了我的最終解決方案,希望這有任何幫助。
編輯/更新
忘了更新我的重複解決方案,因此它並沒有切斷,使循環可見..現在完成:)
我會創建多個ContentControl
S(或任何控制你想使用),並把它們放在水平方向的StackPanel
。 ContentControl
的數量取決於內容的大小。因此,我會創建一個ContentControl
,分配內容,然後調用Measure(...)
以確定其所需的大小。根據窗口或父級控件的大小,可以計算需要創建多少個控件才能填充整個空間。這將是這個樣子:
Initial state (1): +------------- Parent Control -------------+
| |
|+---------+ +---------+ +---------+ +-----|---+ +---------+
|| Gaurang | | Gaurang | | Gaurang | | Gaur|ng | | Gaurang |
|+---------+ +---------+ +---------+ +-----|---+ +---------+
| |^^^^^^^^^^^^^^^^
+------------------------------------------+ not visible!
然後我會把StackPanel
與ContentControls
成Canvas
和動畫StackPanel
的Canvas.Left
財產,使其移動到所需的方向。
現在的問題是,StackPanel
結束將進入可視面積不會有更多的ContentControl
顯示:
Bad state (2): +------------- Parent Control -------------+
| |
+---------+ +-------|-+ +---------+ +---------+ +---------+ |
| Gaurang | | Gauran| | | Gaurang | | Gaurang | | Gaurang | |
+---------+ +-------|-+ +---------+ +---------+ +---------+ |
^^^^^^^^^^^^^^^^^^^^| |
not visible +------------------------------------------+
^^^^
BAD
您可以通過限制StackPanel
的動畫解決這個問題Canvas.Left
屬性,所以它只能移動,直到第一ContentControl
被移出可見區域:
Final state (3): +------------- Parent Control -------------+
| |
+---------+|+---------+ +---------+ +---------+ +-----|---+
| Gaurang ||| Gaurang | | Gaurang | | Gaurang | | Gaur|ng |
+---------+|+---------+ +---------+ +---------+ +-----|---+
| |
+------------------------------------------+
一旦達到這種狀態,動畫應該小號從一開始,即回到初始狀態(1)。這樣,你總是會在狀態(1)和狀態(3)之間動畫。由於所有的ContentControl
都具有相同的尺寸,所以用戶獲得無限移動動畫的印象。當然,動畫應該配置爲無限重複。
注:我沒有測試這個,但我認爲它應該工作。
現在我測試了它,它工作。這裏是我的測試代碼:
<Canvas>
<StackPanel x:Name="stack" Orientation="Horizontal">
<StackPanel.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="(Canvas.Left)"
From="0" To="-68"
FillBehavior="Stop" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</StackPanel.Triggers>
<ContentControl Content="Gaurang" Margin="4" Width="60"/>
<ContentControl Content="Gaurang" Margin="4" Width="60"/>
<ContentControl Content="Gaurang" Margin="4" Width="60"/>
<ContentControl Content="Gaurang" Margin="4" Width="60"/>
<ContentControl Content="Gaurang" Margin="4" Width="60"/>
<ContentControl Content="Gaurang" Margin="4" Width="60"/>
<ContentControl Content="Gaurang" Margin="4" Width="60"/>
<ContentControl Content="Gaurang" Margin="4" Width="60"/>
<ContentControl Content="Gaurang" Margin="4" Width="60"/>
</StackPanel>
</Canvas>
將其粘貼到一個空白的WPF窗口並運行它。您可以增加窗口的大小以查看真正發生的情況 - 動畫僅移動一個ContentControl
,然後從頭開始。
請注意,To="-68"
使用Width
+ Margin.Left
+ Margin.Right
來計算。在你的情況下,你將不得不在代碼隱藏中手動添加ContentControl
,確定它們的寬度並相應地設置動畫的To
屬性。
這不能正常工作。例如,如果你將gaurang0,gaurang1作爲文本,那麼gaurang0總是在左邊,並且從遠處不會捲動。 – DermFrench
@DermFrench:最初的問題是關於一遍又一遍地重複相同的文本。當然,這種解決方案不適用於不同的文本標籤。 – gehho
我創建了一個應用程序,將RSS源顯示爲一個像股票代碼一樣從右向左移動的股票代碼。將它修改爲股票代碼應該是微不足道的。 RumorMill4
該鏈接有一個簡短的教程和所有的源代碼,但你需要知道的一件事是這個代碼在一個隊列中工作,所以一旦一個項目已經滾動,它就會被取消排隊。那時您可以檢查數據是否仍然相關,並更新它,然後將其添加回隊列以供顯示。
不幸的是,這個實現不支持DataBinding,所以當ticker正在移動項目時你不能調整這些值。 (多年前就寫過了,RSS Feed不像股票那樣改變,所以不是優先事項。)
所以你的文本將只是「Gaurang」,它應該作爲選取框移動嗎?你可以使用任何這種鏈接1)http://jobijoy.blogspot.in/2008/08/wpf-custom-controls-marquee-control.html,2)http://weblogs.asp.net/razan/archive /2009/10/01/creating-marquee-scrolling-text-in-wpf.aspx,3)http://www.codeproject.com/Articles/48267/Making-a-Simple-Marquee-Text-Control-Drip -Animatio –
Hi Milan。是的,我的文本是Gaurang,它應該移動正確,但它應該是無盡的文本滾動之間沒有任何差距。 – Gaurang
你是否應該重複如果列表中沒有其他文本存在? –