Поведение для смеси (Silverlight 4) - PullRequest
5 голосов
/ 02 июня 2010

Мне интересно, знает ли кто-нибудь какое-нибудь хорошее (бесплатное) поведение для Blend / Silverlight 4

В частности, я ищу поведение, которое я могу сбросить на TextBlock сделать так, чтобы он прокручивался горизонтально или поведение, которое будет «мигать» текстом в TextBlock (мигающий текст). Но я бы хотел услышать о любом поведении, которое вы использовали или о котором знаете.

В качестве примера, у меня есть очень простое поведение "мигающий текст"

public class FlashTextBehavior : Behavior<TextBlock>
{
    Timer flashTimer;

    public FlashTextBehavior()
    {

    }

    protected override void OnAttached()
    {
        base.OnAttached();
        flashTimer = new Timer(new TimerCallback((o) => 
        {
            Dispatcher.BeginInvoke(() =>
            {
                if (AssociatedObject.Visibility == Visibility.Visible)
                    AssociatedObject.Visibility = Visibility.Collapsed;
                else
                    AssociatedObject.Visibility = Visibility.Visible;
            });               
        }), null, 0, 750);
    }

    protected override void OnDetaching()
    {
        if (flashTimer != null)
            flashTimer.Dispose();

        base.OnDetaching();
    }
}

Конечно, это можно улучшить, но мне действительно интересно, что еще люди придумали.

1 Ответ

1 голос
/ 03 апреля 2015

Для прокрутки текстового блока я рекомендую следующее, потому что translatetransform и отсечение не так гладко, давайте добавим в xaml:

<ScrollViewer Margin="40" Width="100"  VerticalAlignment="Top" HorizontalAlignment="Left" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden" HorizontalScrollMode="Enabled">
        <i:Interaction.Behaviors>
            <behaviors:ScrollHorizontalBehavior/>
        </i:Interaction.Behaviors>
        <TextBlock Foreground="White" Text="asdfasdfasdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf HALF asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf LAST" >
        </TextBlock>
    </ScrollViewer>

А теперь конвертер:

public class ScrollHorizontalBehavior : DependencyObject, IBehavior
{
    public DependencyObject AssociatedObject { get; private set; }

    public void Attach(DependencyObject associatedObject)
    {
        AssociatedObject = associatedObject;
        InitializeTranslation();
    }

    private DispatcherTimer UITimer { get; set; }
    private void InitializeTranslation()
    {
        var element = AssociatedObject as ScrollViewer;
        UITimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(30) };
        UITimer.Tick += (s, e) =>
        {
            var newvalue = element.HorizontalOffset + 20;
            if (newvalue > element.ScrollableWidth)
                newvalue = 0;
            element.ChangeView(newvalue, null, null);
        };
        UITimer.Start();
    }

    public void Detach()
    {
        if (UITimer != null) UITimer.Stop();
    }
}

И, как вы видите, лучше всего то, что вы можете управлять тем, что делать в конце прокрутки.

А теперь добавим мигающее поведение

  <TextBlock Foreground="White" Text="asdfasdfasdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf HALF asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf LAST" >
             <i:Interaction.Behaviors>
            <behaviors:BlinkingBehavior/>
        </i:Interaction.Behaviors>
  </TextBlock>

где поведение проще:

public class BlinkingBehavior : DependencyObject, IBehavior
{
    public DependencyObject AssociatedObject { get; private set; }

    public void Attach(DependencyObject associatedObject)
    {
        AssociatedObject = associatedObject;
        InitializeBlinking();
    }

    bool firstcolor = true;
    private void InitializeBlinking()
    {
        var element = AssociatedObject as TextBlock;

        var brushA = new SolidColorBrush(Colors.Red);
        var brushB = new SolidColorBrush(Colors.White);

        UITimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(1000) };
        UITimer.Tick += (s, e) =>
        {
            element.Foreground = firstcolor ? brushA : brushB;
            firstcolor = !firstcolor;
        };
        UITimer.Start();
    }

    private DispatcherTimer UITimer { get; set; }

    public void Detach()
    {
        if (UITimer != null) UITimer.Stop();
    }
}

Примечание: я сделал это для Windows 10, так что в вашем случае это может немного измениться. Мне понадобится немного времени, чтобы сделать это, поэтому пометьте его как ответ, если вы найдете его действительно полезным.

...