2013-10-04 31 views
0

我使用WPF作爲我的C#應用​​程序,其中有幾個標籤中的文本不適合。我想要的是讓我的文本在標籤內移動,以便用戶可以看到整個文本。 示例:假設我的文本長度爲20個字符,按我的標籤只有15個字符有足夠的空間。我想要的是我的標籤顯示前15個字符(字符1-15),然後在1秒後顯示相同的字符沒有第一個,但與另一個在結尾(所以字符2-16),然後是下一個(字符3-17 )等,直到最後15個字符(字符5-20),然後我希望它們從頭開始(字符1-15再次)。WPF C#:標籤不夠大

我該怎麼做?一種方法是(顯然)使用定時器,但我相信存在更優雅的解決方案。

+1

你有沒有考慮使用工具提示? – Shoe

+0

昨天我不得不這樣做。我選擇保留整個字符串並調整字體大小。 –

+0

@Shoe,工具提示並不是我想要的。不管怎麼說,還是要謝謝你。 – TheQuestioner

回答

2

下面是一個快速和骯髒的滾動控制應該做的代碼是什麼你想盡快用戶鼠標控制。

 <Canvas Name="brd" 
       ClipToBounds="True" 
       Margin="10" 
       Height="20" Width="150" 
       Background="White" 
       HorizontalAlignment="Left"> 
      <StackPanel Name="spl1" 
         Orientation="Horizontal" 
         Canvas.Left="0"> 
       <TextBlock Name="tbk1" 
          Margin="10,0" 
          MinWidth="{Binding ElementName=brd,Path=ActualWidth}" 
          Text="A display of test text that is wider than the control."/> 
       <TextBlock MinWidth="{Binding ElementName=brd,Path=ActualWidth}" 
          Margin="10,0" 
          Text="{Binding ElementName=tbk1,Path=Text}"/> 
      </StackPanel> 
      <Canvas.Triggers> 
       <EventTrigger RoutedEvent="MouseEnter"> 
        <BeginStoryboard Name="scroll"> 
         <Storyboard RepeatBehavior="Forever"> 
          <DoubleAnimation To="-200" Duration="0:0:4" 
              Storyboard.TargetName="spl1" 
              Storyboard.TargetProperty="(Canvas.Left)" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
       <EventTrigger RoutedEvent="MouseLeave"> 
        <StopStoryboard BeginStoryboardName="scroll"/> 
       </EventTrigger> 
      </Canvas.Triggers> 
     </Canvas> 

有一部分,你將需要改變適當的操作,t我沒有實施的帽子。 <DoubleAnimation To="-200"...將需要更改。理想情況下,To的值將是tbk1控件的ActualWidth屬性的負值。這將需要綁定一個元素來獲取值,並且需要一個ValueConverter來使該值爲負值。

如果你不想去轉換器的麻煩,你可以使To值足夠大,以適應您期望的最長的文本。這會讓你相當接近。

當然,您可以對此進行調整,以在一個動畫週期結束時和下一個動畫週期開始時提供更平滑的過渡。

編輯

OK,我不能離開它完成了一半。以下是更新後的XAML的流暢操作,以及ValueConverter的附帶代碼。

<Window.Resources> 
    <Converters:ChangeSignConverter x:Key="ChangeSignConverter"/> 
</Window.Resources> 

     <Canvas Name="brd" 
       ClipToBounds="True" 
       Margin="10" 
       Height="20" Width="150" 
       Background="White" 
       HorizontalAlignment="Left"> 
      <StackPanel Name="spl1" 
         Margin="5,0,0,0" 
         Orientation="Horizontal" 
         Canvas.Left="0"> 
       <TextBlock Name="tbk1" 
          Padding="0,0,10,0" 
          MinWidth="{Binding ElementName=brd,Path=ActualWidth}" 
          Text="A display of test text that is wider than the control."/> 
       <TextBlock MinWidth="{Binding ElementName=brd,Path=ActualWidth}" 
          Text="{Binding ElementName=tbk1,Path=Text}"/> 
      </StackPanel> 
      <Canvas.Triggers> 
       <EventTrigger RoutedEvent="MouseEnter"> 
        <BeginStoryboard Name="scroll"> 
         <Storyboard RepeatBehavior="Forever"> 
          <DoubleAnimation To="{Binding ElementName=tbk1,Path=ActualWidth,Converter={StaticResource ChangeSignConverter}}" 
              Duration="0:0:4" 
              Storyboard.TargetName="spl1" 
              Storyboard.TargetProperty="(Canvas.Left)" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
       <EventTrigger RoutedEvent="MouseLeave"> 
        <StopStoryboard BeginStoryboardName="scroll"/> 
       </EventTrigger> 
      </Canvas.Triggers> 
     </Canvas> 

Converter類:

class ChangeSignConverter : IValueConverter 
{ 
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    return Convert.ToDouble(value) * -1; 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    return Convert.ToDouble(value) * -1; 
    } 
} 
+0

非常好的解決方案,工作得很好,但我沒有設法讓它工作,沒有用我的鼠標在文本塊上。在這裏我相信我應該提供更多的細節:所以我的程序讀取文件和我正在討論的標籤(需要滾動的標籤)顯示文件的名稱。由於文件名稱可能很長,我想要這個「滾動」效果。那麼,我怎樣才能讓我的文字一直滾動,而不用用我的鼠標呢? – TheQuestioner

+0

@TheQuestioner,如果你不想要求用戶移動他們的鼠標,你可以更好地設置一個不同的EventTrigger來滿足你的需求。 http://msdn.microsoft.com/en-us/library/system.windows.eventtrigger.aspx – Stewbob

+0

,這就是我必須改變的一切。多謝老兄! :) – TheQuestioner

0

我也會用你所描述的功能來使用Timer。我認爲如果你堅持在某個指定的時間間隔內更改標籤,其他解決方案並不多。另一方面,我可能會使用ToolTip,我認爲這更直觀。

+0

謝謝,工具提示並不是我想要的。 – TheQuestioner

1

您也可以使用WPF animation功能。您創建了一個內部具有TextBlock的自定義控件。定義控件的寬度(它將小於文本塊的寬度,然後定義故事板和雙動畫以根據需要爲其設置動畫效果(較慢/較快,只向右移動,右移動等等)

這只是一個想法。我目前在匆忙,但我可以爲您提供額外的代碼,如果你需要它。