PDA

View Full Version : سوال: تابع invoke در wpf



vaheeed
شنبه 15 مهر 1391, 10:13 صبح
سلام
یه فرم wpf دارم که باید با thread باهاش کاری انجام بدم . داخل فرم های معمولی با صدا زدن تابع invoke اعمالی که میخواستم در ظاهر فرم تغییر کنه انجام میشد اما داخل wpf اصلا میزنم this.invoke نمیشناسش!!! میشه راهنمایی کنید؟
ممنون

vaheeed
شنبه 15 مهر 1391, 11:48 صبح
من احتیاج به یه جور تیک دارم که وقتی برنامه داره اجرا میشه فرم هنگ نباشه و تغییری که در ظاهر فرم اعمال میشه رو نمایش بده ، رفتم از تایمر استفاده کنم نبود داخل wpf کسی پیشنهاد نداره؟؟

morteza271
شنبه 15 مهر 1391, 12:07 عصر
از این به جای Invoke در wpf استفاده میشه :

System.Windows.Application.Current.Dispatcher.Begi nInvoke(new Action(delegate()
{
// Your code...
}));

در ضمن در wpf تایمر هم هست و فقط باید using بشه.
using System.Threading;
using System.Windows.Forms;
using System.Timers;

بسته به نوع تایمری که میخوای یک از خطهای بالا رو بذار.
موفق باشی

vaheeed
شنبه 15 مهر 1391, 12:21 عصر
مرسی
کد بالا رو من مستقیم وارد کردم میگه current یک نوع هست ولی به صورت متغیر استفاده شده!! داخل تابع invoke باید یه تابع رو بدیم اینجا چی ؟؟ چجوری باید کار کنیم؟؟

morteza271
شنبه 15 مهر 1391, 12:23 عصر
نمیدونم شما چطوری ازش استفاده کردین.
کدتون رو بذارین تا بهتون بگم چیکار کنین.

vaheeed
شنبه 15 مهر 1391, 12:36 عصر
ارور که میداد واسه این بود که وقتی گذاشتین رو وب کدش یه فاصله الکی خودش گرفته بود درست شد
کد هم به صورت زیر هست:

morteza271
شنبه 15 مهر 1391, 12:45 عصر
کدی که گذاشتین الان درسته و نباید مشکلی داشته باشه.

vaheeed
شنبه 15 مهر 1391, 12:52 عصر
وقتی اجرا میکنم این اررور میده :
{"Object reference not set to an instance of an object."}

morteza271
شنبه 15 مهر 1391, 13:05 عصر
این خطا به خاطر اینه که یکی از متغیرها یا آبجکت هایی که استفاده کردین مقدارش null هست و مقداردهی نشده و ربطی به این کدهای Invoke نیست.
برنامتون رو Trace ببینید کجای برنامتون خطا رو میده

vaheeed
شنبه 15 مهر 1391, 13:24 عصر
میشه لطفا یه بار دیگه کد رو نگاه کنید تو قسمت delegate نباید چیزی بنویسم ؟؟ آخه تمام متغییر ها که تعریف کردم مقدار دارن چیزی null نیست!!! وقتی کد رو همینجوری اجرا میکنم (بدون تابع invoke ) خطا نداره فقط اینجا خطا میده
مرسی که وقت میزارین

morteza271
شنبه 15 مهر 1391, 13:31 عصر
احتمالا از این دو خط خطا میده :
thread1.Abort();
con.Close();
آره؟؟
دقیقا بهم بگین کجا خطا میده تا بتونم کمکتون کنم.
من که علم غیب ندارم.

vaheeed
شنبه 15 مهر 1391, 13:37 عصر
ببخشید نفهمیدم منظورتون رو همون اول ، دقیقا همون قسمتی که شما گفتین نوشتم خطا میده کل بلوک رو زرد میکنه و همون پیغام خطا که گفتم رو میده
یعنی این قسمت رو :
System.Windows.Application.Current.Dispatcher.Begi nInvoke(new Action(delegate()
{
try
{
foreach (Shape c in grid1.Children)
{
if (c is Ellipse && c.Name == "V" + ((i - 1).ToString()))
{
Ellipse ellnew = c as Ellipse;
ellnew.Stroke = Brushes.Red;
ellnew.Fill = Brushes.Yellow;
}
}
}
catch
{ }

}));

morteza271
شنبه 15 مهر 1391, 13:44 عصر
پس احتمالا ellnew مقداردهی نمیشه!
در این خط :
Ellipse ellnew = c as Ellipse;
کدش رو به این صورت بنویسید ببینید چی میشه :
Ellipse ellnew = c as Ellipse;
if(ellnew != null)
{
ellnew.Stroke = Brushes.Blue;
ellnew.Fill = Brushes.Cornsilk;
}

vaheeed
شنبه 15 مهر 1391, 13:50 عصر
:ناراحت: نه نشد بازم همون خطا در همون قسمت

morteza271
شنبه 15 مهر 1391, 13:54 عصر
واقعا نمیدونم مشکلش چیه!!!!!!!
اگه امکانش هست پروژتون رو بذارین تا ببینم میتونم کاری بکنم یا نه!

vaheeed
شنبه 15 مهر 1391, 14:05 عصر
حجمش زیاده نمیشه آپلود کنم میشه آی دی تو بدی بفرستم؟؟

morteza271
شنبه 15 مهر 1391, 14:10 عصر
واستون به صورت پیام خصوصی فرستادم.