2014-02-21 68 views
2

GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG GAURANG連續文本北京時間WPF中

我在WPF合作,創建一個文本股票。我可以永遠將文本從右向左移動,但我的問題是,我想要無縫地移動相同的文本以創建上述效果(就像股票交易所股票代碼一樣)。以上文字必須無止境地移動。

我該如何實現它?

+0

所以你的文本將只是「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 –

+0

Hi Milan。是的,我的文本是Gaurang,它應該移動正確,但它應該是無盡的文本滾動之間沒有任何差距。 – Gaurang

+0

你是否應該重複如果列表中沒有其他文本存在? –

回答

2

所以從閱讀你的問題我不確定你想要什麼。你想要一個文本,滾動出文本框,並重新開始,像大多數選框控件/函數。

或者你想在文本框中反覆運行一些文本,從開始到結束填充它?然後用一個不可檢測的給定循環? :)

後面的代碼:

//單行動畫。

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:

所以現在嘗試一下,我已經更新了代碼..希望它作品,但從幾個測試看來,它似乎:)只有你需要確定的是整個文本框被填寫,然後我做了一個副本,我會循環兩個文本字符串圖形長度:)(

編輯/更新: 我已經添加了我的最終解決方案,希望這有任何幫助。

編輯/更新

忘了更新我的重複解決方案,因此它並沒有切斷,使循環可見..現在完成:)

+0

是的,我想第二個選項。我想要一些在我的文本塊中反覆運行的文本,從開始到結束填充它並滾動它 – Gaurang

+0

是的,那就是我正在尋找的 – Gaurang

+0

問題在於有很多變量需要考慮。 Fontsize,fontfamily,textboxwidth,text.lenght等等。所以我不確定你在文本框內放置了什麼,但是我認爲如果文本改變或者與文本框有關的其他改變,管理會變得有點複雜。如果一切都是靜態的,你幾乎可以做我剛做的事情。 :)但我會繼續尋找一段時間,看看我能拿出:) –

4

我會創建多個ContentControl S(或任何控制你想使用),並把它們放在水平方向的StackPanelContentControl的數量取決於內容的大小。因此,我會創建一個ContentControl,分配內容,然後調用Measure(...)以確定其所需的大小。根據窗口或父級控件的大小,可以計算需要創建多少個控件才能填充整個空間。這將是這個樣子:

Initial state (1): +------------- Parent Control -------------+ 
        |           | 
        |+---------+ +---------+ +---------+ +-----|---+ +---------+ 
        || Gaurang | | Gaurang | | Gaurang | | Gaur|ng | | Gaurang | 
        |+---------+ +---------+ +---------+ +-----|---+ +---------+ 
        |           |^^^^^^^^^^^^^^^^ 
        +------------------------------------------+ not visible! 

然後我會把StackPanelContentControlsCanvas和動畫StackPanelCanvas.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屬性。

+1

這不能正常工作。例如,如果你將gaurang0,gaurang1作爲文本,那麼gaurang0總是在左邊,並且從遠處不會捲動。 – DermFrench

+0

@DermFrench:最初的問題是關於一遍又一遍地重複相同的文本。當然,這種解決方案不適用於不同的文本標籤。 – gehho

0

我創建了一個應用程序,將RSS源顯示爲一個像股票代碼一樣從右向左移動的股票代碼。將它修改爲股票代碼應該是微不足道的。 RumorMill4

該鏈接有一個簡短的教程和所有的源代碼,但你需要知道的一件事是這個代碼在一個隊列中工作,所以一旦一個項目已經滾動,它就會被取消排隊。那時您可以檢查數據是否仍然相關,並更新它,然後將其添加回隊列以供顯示。

不幸的是,這個實現不支持DataBinding,所以當ticker正在移動項目時你不能調整這些值。 (多年前就寫過了,RSS Feed不像股票那樣改變,所以不是優先事項。)