Как вы делаете эффекты перехода, используя элемент управления Frame в WPF?

Алгоритм:

  • Подсчитайте от 1 до 2 ^ n.
  • Преобразуйте каждую цифру в ее двоичное представление.
  • бит в элементы вашего набора, в зависимости от положения.

В C #:

void Main()
{
    var set = new [] {"A", "B", "C", "D" }; //, "E", "F", "G", "H", "I", "J" };

    var kElement = 2;

    for(var i = 1; i < Math.Pow(2, set.Length); i++) {
        var result = Convert.ToString(i, 2).PadLeft(set.Length, '0');
        var cnt = Regex.Matches(Regex.Escape(result),  "1").Count; 
        if (cnt == kElement) {
            for(int j = 0; j < set.Length; j++)
                if ( Char.GetNumericValue(result[j]) == 1)
                    Console.Write(set[j]);
            Console.WriteLine();
        }
    }
}

Почему это работает?

биекция между подмножествами n-элементного множества и n-битовых последовательностей.

Это означает, что мы можем выяснить, сколько подмножеств существует путем подсчета последовательностей.

, например, четыре приведенных ниже элемента могут быть представлены {0,1} X {0, 1} X {0, 1} X {0, 1} (или 2 ^ 4) различными последовательностями.

Итак, все, что нам нужно сделать, это считать от 1 до 2 ^ n, чтобы найти все комбинации. (Мы игнорируем пустое множество.) Затем переведите цифры в их двоичное представление. Затем замените элементы вашего набора на биты «on».

Если вы хотите получить только результаты k-элемента, только распечатывайте, когда k бит «включено».

(Если вы хотите, чтобы все подмножества вместо подмножеств k длины удаляли часть cnt / kElement.)

(Для доказательства см. бесплатную учебную программу MIT Mathematics for Computer Science, Lehman et al. , раздел 11.2.2. https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/readings/ )

16
задан Dave Clemmer 17 September 2011 в 00:00
поделиться

2 ответа

Существует аналогичная проблема, обсуждаемая здесь: Анимация перехода FADE при навигации на страницу Использование техники, описанного там, вы можете скользить \ перемещать свой контроль кадра каждый раз, когда новая страница навигация. Вроде этого:

XAML:

...
<Frame Name = "frame" Navigating="frame_Navigating">
...

код:

...
private bool                        _allowDirectNavigation = false;
private NavigatingCancelEventArgs   _navArgs = null;
private Duration                    _duration = new Duration(TimeSpan.FromSeconds(1));
private double                      _oldHeight = 0;

private void frame_Navigating(object sender, NavigatingCancelEventArgs e)
{
    if (Content!=null && !_allowDirectNavigation)
    {
        e.Cancel = true;

        _navArgs = e;
        _oldHeight = frame.ActualHeight;

        DoubleAnimation animation0 = new DoubleAnimation();
        animation0.From = frame.ActualHeight;
        animation0.To = 0;
        animation0.Duration = _duration;
        animation0.Completed += SlideCompleted;
        frame.BeginAnimation(HeightProperty, animation0);
    }
    _allowDirectNavigation = false;
}

private void SlideCompleted(object sender, EventArgs e)
{
    _allowDirectNavigation = true;
    switch (_navArgs.NavigationMode)
    {
        case NavigationMode.New:
            if (_navArgs.Uri == null)
                frame.Navigate(_navArgs.Content);
            else
                frame.Navigate(_navArgs.Uri);
            break;
        case NavigationMode.Back:
            frame.GoBack();
            break;
        case NavigationMode.Forward:
            frame.GoForward();
            break;
        case NavigationMode.Refresh:
            frame.Refresh();
            break;
    }

    Dispatcher.BeginInvoke(DispatcherPriority.Loaded,
        (ThreadStart)delegate()
        {
            DoubleAnimation animation0 = new DoubleAnimation();
            animation0.From = 0;
            animation0.To = _oldHeight;
            animation0.Duration = _duration;
            frame.BeginAnimation(HeightProperty, animation0);
        });
}
...

Надеюсь, это поможет, считает

19
ответ дан 30 November 2019 в 21:03
поделиться

Возможно, это не лучший ответ, но он может быть полезен для вас или, по крайней мере, дать вам некоторые идеи. В Silverlight я добился такого типа эффекта скользящего перехода между страницами, используя TransitioningContentControl из Silverlight Toolkit. Это управление содержимым, которое, по сути, позволяет вам определить пользовательский раскадровку в визуальном состоянии для перехода между старым и новым содержимым при каждом его изменении. Он также включает некоторые переходы по умолчанию (fade/up/down), если вы не хотите тратить время на определение пользовательского раскадровки.

Я понимаю, что вы работаете с WPF и что TransitioningContentControl недоступен в WPF или в WPF Toolkit. Однако, может быть не слишком сложно перенести это управление в WPF или, по крайней мере, сделать что-то подобное. Оглядываясь на источник, можно подумать, что это можно сделать, если у вас есть время, и именно этот тип управления вы можете использовать в других местах.

Исходный код здесь для версии Silverlight, а у Джесси Либерти есть хорошее учебное пособие , которое проходит через использование элемента управления в Silverlight.

1
ответ дан 30 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: