Taskbariteminfo не показывает наложение заданное из кода
Привет, я пытаюсь установить achieve skype like notification для моего приложения wpf tired solutions, чтобы достичь этого из кода позади, но либо застреваю на ошибке "вызывающий поток не может получить доступ к объекту, потому что им владеет другой поток", либо когда я создаю новый поток и добавляю наложение в TaskbarItemInfo, ничего не происходит
Что я уже пробовал:
public void createIcon(string countNot) { try { RectangleF rectF = new RectangleF(0, 0, 40, 40); Bitmap bitmap = new Bitmap(40, 40, System.Drawing.Imaging.PixelFormat.Format24bppRgb); Graphics g = Graphics.FromImage(bitmap); g.FillRectangle(System.Drawing.Brushes.White, 0, 0, 40, 40); g.DrawString(countNot, new Font("Arial", 25), System.Drawing.Brushes.Black, new PointF(0, 0)); IntPtr hBitmap = bitmap.GetHbitmap(); ImageSource wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap( hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); new Thread(() => { Thread.CurrentThread.IsBackground = false; Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate { TaskbarItemInfo ittem = new TaskbarItemInfo(); ittem.Overlay = wpfBitmap; }, null); }).Start(); } catch (Exception ex) { string path = @"C:\Logs\logs.txt"; File.AppendAllLines(path, new[] { "---------------------" + "\rn" + ex.Message + "\n" + " stack trace: " + ex.StackTrace }); } }
Gerry Schmitz
Похоже, много хлопот напрасно. WPF не требует этого низкоуровневого crud.
Harmohan Singh
Не понял тебя Джерри
Richard Deeming
new Thread(() => { Thread.CurrentThread.IsBackground = false; Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate { TaskbarItemInfo ittem = new TaskbarItemInfo(); ittem.Overlay = wpfBitmap; }, null); }).Start();
Почему вы запускаете новый поток только для того, чтобы вернуться в поток пользовательского интерфейса?
Если вы уже находитесь в потоке пользовательского интерфейса, просто создайте и обновите его.
TaskbarItemInfo
непосредственно. Если вы находитесь в потоке, не относящемся к пользовательскому интерфейсу, просто позвоните Application.Current.Dispatcher.BeginInvoke
непосредственно. Ни случае требует new Thread(...).Start()
обертка.