2013-07-04 9 views
16

Zastanawiam się, czy mogę utworzyć TextBox lub jakąkolwiek kontrolę, że możesz napisać jakiś tekst na nim, aby być jak Word 2013, animacja jest bardzo dobra.Pisanie tekstów Animacja jak word2013

Jestem teraz w stanie zrobić rodzaj animacji na samej kontrolce (TextBox, ...), ale aby zrobić ten typ animacji na kursor lub na samym tekście jest to nowe.

enter image description here
enter image description here

+7

Dla przejrzystości (i tych, którzy nie widzieli), kursor w pakiecie Office 2013 ma animację przeciągnięcia, gdy porusza się pomiędzy znakami (w tym podczas wpisywania lub po kliknięciu arkusza kalkulacyjnego programu Excel). –

+3

Jeśli się nie mylę, może ta decyzja nie będzie łatwa. 'Animacja' w' TextBox' jest ograniczonym programistom z powodu funkcji renderowania 'WPF'. Na przykład właściwość text nie jest właściwością zależności, więc animacja, której on nie może dotyczyć. Z drugiej strony, w "MS Office" działa to i nadzieja jest realizowana normalnie. Jest więc nadzieja na rozwiązanie ... ale na czym? –

+0

Osobiście naprawdę nienawidzę tych animacji w Office 2013 bardzo bardzo. AAAAARGH! –

Odpowiedz

4

Można utworzyć kontrolkę użytkownika WPF lub kontrolkę niestandardową, która dziedziczy po domyślnym polu tekstowym WPF. Udało mi się utworzyć pole tekstowe, które animuje pozycję kursora za pomocą następującej metody:

1-Utwórz kontrolkę użytkownika i dodaj do niej pole tekstowe.

2-Dodaj płótno z prostokątem w środku (prostokąt to twój nowy kursor).

3-Ustaw Texboxes CaretBrush na przezroczysty.

4-W kodzie użytkownika UserControl utwórz metodę animacji kursora po zmianie położenia kursora.

5 - Wywołaj metodę animacji od kroku 4, gdy wystąpią określone zdarzenia, które zmieniły pozycję kursora.

przykład:

UserControl XAML

<UserControl 
     x:Class="YourNamespace.AnimatedCursorTextBox" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="23" 
     d:DesignWidth="300" 
     xmlns:c="clr-namespace:System.Windows.Controls;assembly=PresentationFramework" 
     Name="Control"> 
     <UserControl.Resources> 
      <c:BooleanToVisibilityConverter 
       x:Key="BoolToVisibility" /> 
     </UserControl.Resources> 
     <Grid> 
      <TextBox 
       Name="MainTextBox" 
       CaretBrush="Transparent" 
       SelectionChanged="MainTextBox_SelectionChanged" 
       TextChanged="MainTextBox_TextChanged" 
       GotKeyboardFocus="MainTextBox_GotKeyboardFocus" /> 
      <Canvas 
       Visibility="{Binding IsKeyboardFocusWithin, 
        ElementName=Control, 
        Converter={StaticResource BoolToVisibility}}" 
       Height="{Binding ActualHeight, ElementName=MainTextBox}" 
       Width="{Binding ActualWidth, ElementName=MainTextBox}"> 
       <Rectangle 
        HorizontalAlignment="Left" 
        Name="Caret" 
        Width="1" 
        Fill="Black" /> 
      </Canvas> 
     </Grid> 
    </UserControl> 

opóźnieniem kodu:

public partial class AnimatedCursorTextBox : UserControl 
     { 
      private DoubleAnimation cursorAnimation = new DoubleAnimation(); 

      public AnimatedCursorTextBox() 
      { 
       InitializeComponent(); 
      } 

      private void UpdateCaretPosition() 
      { 
       var rectangle = MainTextBox.GetRectFromCharacterIndex(MainTextBox.CaretIndex); 
       Caret.Height = rectangle.Bottom - rectangle.Top; 
       Canvas.SetTop(Caret, rectangle.Top); 
       Canvas.SetBottom(Caret, rectangle.Bottom); 

       var left = Canvas.GetLeft(Caret); 
       if (!double.IsNaN(left)) 
       { 
        cursorAnimation.From = left; 
        cursorAnimation.To = rectangle.Right; 
        cursorAnimation.Duration = new Duration(TimeSpan.FromSeconds(.05)); 

        Caret.BeginAnimation(Canvas.LeftProperty, cursorAnimation); 
       } 
       else 
       { 
        Canvas.SetLeft(Caret, rectangle.Right); 
       } 
      } 

      private void MainTextBox_SelectionChanged(object sender, RoutedEventArgs e) 
      { 
       UpdateCaretPosition(); 
      } 

      private void MainTextBox_TextChanged(object sender, TextChangedEventArgs e) 
      { 
       UpdateCaretPosition(); 
      } 

      private void MainTextBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
      { 
       UpdateCaretPosition(); 
      } 
     } 

Uwaga: Nie jest kompleksowe rozwiązanie, ponieważ nie obsługuje animacji podkreślenia wybrane tekst i nie ukrywa kursora, gdy tekst jest podświetlony, ale jest to początek. Polecam tworzenie tego jako kontrolki niestandardowej dziedziczącej z TextBox, a następnie układ układu kontrolki w szablonie domyślnego stylu pola tekstowego zamiast używania kontrolki UserControl. W ten sposób możesz zachować wszystkie funkcje TextBox, ale wciąż masz nowe funkcje animacji. Aby uzyskać więcej informacji o sterowaniach niestandardowych w WPF, zobacz artykuł o kodzie codeproject: this.

Aby zmienić szybkość animacji, po prostu zmień czas trwania animacji kursora.

-1

Nie chcę być niegrzeczny, ale twój angielski jest nieco skomplikowany, aby w pełni zrozumieć, więc mam nadzieję, że to jest blisko tego, co chciałeś?

Moja rekomendacja to utworzenie nowego elementu sterującego "Textbox" poprzez utworzenie nowego elementu sterującego dziedziczącego pole tekstowe. Następnie przesłonisz zdarzenie onPaint, aby teraz kontrolować sposób rysowania samego pola tekstowego.

public class newTextBox : System.Windows.Forms.TextBox 
{ 
    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
    { 
     base.OnPaint(e); 
    } 
} 

To daje teraz kontrolę nad tym, jak twoja kontrola rysuje się i możesz użyć tego zamiast pól tekstowych z dokładnie takim samym zachowaniem.

Trudnym bitem, który zostawię ci do zrobienia lub otworzysz nowe pytanie, jest strona graficzna rzeczy, więc gdy użytkownik przesunie kursor, płynnie przesuwa linię, którą osobiście rysujesz, w ten sposób mają pełną kontrolę nad.

Jeśli okaże się to trudne, najpierw należy przejrzeć obiekt e.Graphics i zawarte w nim funkcje.

+3

'" Trudnym bitem, który zostawię ci do zrobienia lub otworzysz nowe pytanie, jest strona graficzna rzeczy, więc kiedy użytkownik przesunie kursor, płynnie przesuwa linię, którą osobiście rysujesz "' - Myślę, że o to pyta OP. – keyboardP

+0

@keyboardP WTF, podałem jeden z możliwych kierunków, w którym mógł wejść. Powiedziałem "spróbuj" lub otwórz nowe pytanie, ponieważ jest to inny temat? Myślałem, że jego problemem jest rysunek? Użytkownicy powinni wypróbować opcję, zanim poprosi o więcej i więcej pomocy? – Tom

+1

Nie scharakteryzowałem cię, ale nie podałeś wystarczającej wskazówki, aby OP mógł wejść i nie powinien otwierać nowego pytania, ponieważ ich pytanie jest w porządku. Nie wyjaśniłeś, w jaki sposób metoda OnPaint może przerysować kursor, który jest główną częścią pytania. Zastąpienie metody OnPaint nie jest w ogóle odpowiedzią na pytanie, ponieważ brakuje kluczowej części tego, co powinno się znaleźć w metodzie OnPaint. – keyboardP