WPF

WPF TabControl, rounded TabItem

Есть замечательный пример, как сделать закладки с закруглёнными краями с помощью модификации стиля WPF TabControl и TabItem, но он не поддерживает нижнее расположение закладок TabStripPlacement=»Bottom».

Небольшая модификация примера позволила расположить закладки снизу. Загрузите Полный исходный код для VisualStudio 2010, с 3-имя вариантами TabControl и изменением стиля для нижнего расположения закладок.

Далее

Сохраняем AVI файл из WPF

Собственно сохранение скриншотов WPF программы с помощью RenderTargetBitmap и BitmapEncoder не новость. Сложнее сохранить анимацию и не просто в набор картинок, а сразу в AVI файл.

Мне удалось найти только один способ сделать это, с использованием весьма старой библиотеки http://www.codeproject.com/KB/audio-video/avifilewrapper.aspx Библиотека предназначена для работы с AVI файлами из .NET, написана на C# и работает даже на .NET 1.1.

Если вы знаете другой способ, подскажите!

Если вы хотите работать с AVI из WPF, посмотрите сразу другой пример http://blogs.msdn.com/b/saveenr/archive/2008/09/22/wpf-xaml-saving-an-animation-as-an-avi-video-file.aspx

Пример хороший, но передавать Bitmap через файл слишком накладно, лучше использовать MemoryStream.

    BmpBitmapEncoder encoder = new BmpBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));

    using (MemoryStream stream = new MemoryStream())
    {
        encoder.Save(stream);

        System.Drawing.Bitmap drawingBitmap = new System.Drawing.Bitmap(stream);
        aviStream.AddFrame(drawingBitmap);
    }

Сохранение AVI было необходимо для улучшения программы Particler, поэтому пришлось провести серию экспериментов.

Далее

Индикатор загрузки (progress bar) для WPF

Если ваше WPF приложение медленно загружается, то в зависимости от причины есть 2 выхода — или добавлять Splash Screen в случае, когда приложение «тяжелое» само по себе, или ограничится показом индикатора загрузки данных, если само приложение стартует быстро, но потом еще подгружает объемные данные (например 3D модели).

Такая задача возникла и передо мной. Хотелось сделать круговой индикатор загрузки, похожий на индикатор загрузки Silverlight приложений. Быстрый поиск в интернете подобрал 2 подходящих индикатора:

Круговой индикатор загрузки для WPF Вращающийся круговой индикатор загрузки для WPF

http://www.codeproject.com/KB/WPF/FrameBasedAnimation.aspx, http://www.codeproject.com/KB/smart/Sonic.aspx

Первый мне не понравился потому, что во-первых не компилировался без доработок, а во вторых имел огромное количество C# кода, без которого в WPF вполне можно было обойтись, решив всё на уровне XAML.

Второй индикатор был значительно красивее и работал, но крутил всю картинку целиком, не создавая эффект перелива цветов, а вызывая впечатление, что на нём решили сэкономить.

Небольшая доработка заключалась в том, что я заменил DoubleAnimation на DiscreteDoubleKeyFrame и теперь индикатор загрузки не вращается, а красиво переливается.

Вместо:

<BeginStoryboard> 
    <Storyboard> 
        <DoubleAnimation Storyboard.TargetName="SpinnerRotate" Storyboard.TargetProperty="(RotateTransform.Angle)" From="0" To="360" Duration="0:0:01" RepeatBehavior="Forever" /> 
    </Storyboard> 
</BeginStoryboard>

Сделаем так:

<BeginStoryboard> 
    <Storyboard> 
        <DoubleAnimationUsingKeyFrames Duration="0:0:12" RepeatBehavior="Forever" SpeedRatio="12" Storyboard.TargetName="SpinnerRotate" Storyboard.TargetProperty="(RotateTransform.Angle)"> 
            <DiscreteDoubleKeyFrame KeyTime="00:00:00" Value="0" /> 
            <DiscreteDoubleKeyFrame KeyTime="00:00:01" Value="30" /> 
... 
            <DiscreteDoubleKeyFrame KeyTime="00:00:11" Value="330" /> 
        </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
</BeginStoryboard>

Результат:

Переливающийся круговой индикатор загрузки для WPF

Загрузить компонент Circular Progress Bar и тестовый проект (14,4 Кб)

В следующий раз, я покажу на примере как использовать этот же код для progress bar в Silverlight.

Далее