2

アプリケーションは空の C# プロジェクトから開始され、出力タイプは「Windows アプリ」に設定されています。

using System.Windows.Forms;

static class Program
{
    static System.Windows.Forms.NotifyIcon notifyIcon;
    static System.Drawing.Icon LockedIcon = Properties.Resources.icon_locked;

    [STAThread]
    Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        notifyIcon = new NotifyIcon()
        {
            Icon = LockedIcon,
            ContextMenu = ContextualMenu(),
            Visible = true
        };
        Application.Run()
    }
}

システムトレイアイコンコントロールがないWinFormsため、ベースとして使用しています。WPFただし、他のすべてのウィンドウはWPF. 私は次のように実行しています:

static void ShowUI()
{
    MainUI wnd = new MainUI();  //MainUI is a System.Windows.Window (WPF)
    wnd.Show();
}

への参照がありWindowsFormsIntegrationます。WPFウィンドウは正しく表示され、すべてが機能しているようです。しかし:

public MainUI()
{
    this.Loaded += (o,e) => this.Icon = Properties.Resources.myIcon.ToImageSource();
    InitializeComponent();
}

public static System.Windows.Media.ImageSource ToImageSource(this System.Drawing.Icon i)
{
    System.Windows.Media.ImageSource imgsrc;
    using (System.IO.MemoryStream iconStream = new System.IO.MemoryStream())
    {
        i.Save(iconStream);
        iconStream.Seek(0, System.IO.SeekOrigin.Begin);
        imgsrc = System.Windows.Media.Imaging.BitmapFrame.Create(iconStream);
    }
    return imgsrc;
}

... をスローしSystem.ObjectDisposedExceptionます。ToImageSource()純粋なプロジェクトの場合、拡張メソッドは正常に機能しWPFましたが、コンテキストに切り替えてから、WinForms機能しなくなり、その例外がスローされます。

ワンライナーをいくつかのステップに分割してデバッグを試みました。

System.Drawing.Icon icon = Properties.Resources.myIcon; //works
ImageSource imgsrc = icon.ToImageSource(); //works
wnd.Icon = imgsrc; //System.ObjectDisposedException

何が起こっているのかわからない。実際に実行しないことの副作用WPF Application.Run()ですか?

4

0 に答える 0