0

現在、私は WPF と C# を使用して 1 つのプロジェクトを開発しており、一部はアニメーション イメージに関連しています。.gif ファイルをフォームに追加する方法を教えてもらえますか? ありがとう。

4

3 に答える 3

1

これは完全なコードです。以下のクラスをメインのネームスペースに含めるだけです。メインの wpf フォームは次のように呼び出します。

    <UI:AnimatedGIFControl x:Name="GIFCtrl" Visibility="Collapsed" VerticalAlignment="Center" Margin="200,0,0,0" Width="380" Height="48"/>

ここで、UI は AnimatedGIFControl が定義されている名前空間です。このように呼び出すことができます

          xmlns:UI="clr-namespace:xyz"

完全なクラス コードは、

           class AnimatedGIFControl : System.Windows.Controls.Image
{
    private Bitmap _bitmap; // Local bitmap member to cache image resource
    private BitmapSource _bitmapSource;
    public delegate void FrameUpdatedEventHandler();


    /// <summary>
    /// Delete local bitmap resource
    /// Reference: http://msdn.microsoft.com/en-us/library/dd183539(VS.85).aspx
    /// </summary>
    [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool DeleteObject(IntPtr hObject);

    /// <summary>
    /// Override the OnInitialized method
    /// </summary>
    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);
        this.Loaded += new RoutedEventHandler(AnimatedGIFControl_Loaded);
        this.Unloaded += new RoutedEventHandler(AnimatedGIFControl_Unloaded);
    }

    /// <summary>
    /// Load the embedded image for the Image.Source
    /// </summary>

    void AnimatedGIFControl_Loaded(object sender, RoutedEventArgs e)
    {
       // Get GIF image from Resources


        if (Properties.Resources.ProgressIndicator != null)
        {
            _bitmap = Properties.Resources.ProgressIndicator;
            Width = _bitmap.Width;
            Height = _bitmap.Height;

            _bitmapSource = GetBitmapSource();
            Source = _bitmapSource;
        }
    }

    /// <summary>
    /// Close the FileStream to unlock the GIF file
    /// </summary>
    private void AnimatedGIFControl_Unloaded(object sender, RoutedEventArgs e)
    {
        StopAnimate();
    }

    /// <summary>
    /// Start animation
    /// </summary>
    public void StartAnimate()
    {
        ImageAnimator.Animate(_bitmap, OnFrameChanged);
    }

    /// <summary>
    /// Stop animation
    /// </summary>
    public void StopAnimate()
    {
        ImageAnimator.StopAnimate(_bitmap, OnFrameChanged);
    }

    /// <summary>
    /// Event handler for the frame changed
    /// </summary>
    private void OnFrameChanged(object sender, EventArgs e)
    {
        Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                               new FrameUpdatedEventHandler(FrameUpdatedCallback));
    }

    private void FrameUpdatedCallback()
    {
        ImageAnimator.UpdateFrames();

        if (_bitmapSource != null)
            _bitmapSource.Freeze();

        // Convert the bitmap to BitmapSource that can be display in WPF Visual Tree
        _bitmapSource = GetBitmapSource();
        Source = _bitmapSource;
        InvalidateVisual();
    }

    private BitmapSource GetBitmapSource()
    {
        IntPtr handle = IntPtr.Zero;

        try
        {
            handle = _bitmap.GetHbitmap();
            _bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(
                handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
        }
        finally
        {
            if (handle != IntPtr.Zero)
                DeleteObject(handle);
        }

        return _bitmapSource;
    }

}

そして、このように使用します

                   GIFCtrl.StartAnimate();

それがあなたを助けることを願っています。

于 2012-05-31T06:49:27.217 に答える
0

残念ながら、WPFではGifアニメーションは表示されません。画像コントロールにロードしても、最初のフレームしか表示されません。

于 2012-05-26T07:57:11.373 に答える
0

これはImageではサポートされていませんが、カスタムコントロールを使用したり、WinFormsコントロールをラップしたりするこの重複した回答の解決策のいくつかは、優れた解決策のようです。

于 2012-05-26T08:00:21.997 に答える