سلام، بنده به WPF اومدم و یک فرمی با کاربردی مثل Splash Screen طراحی کردم، حالا تو قسمت Invoke اش موندم. قریب به یک ماهِ هر چی گشتم پیدا نکردم و جوابی نگرفتم. کسی میتونه کمک کنه؟
2015-12-11_002034.png
سلام، بنده به WPF اومدم و یک فرمی با کاربردی مثل Splash Screen طراحی کردم، حالا تو قسمت Invoke اش موندم. قریب به یک ماهِ هر چی گشتم پیدا نکردم و جوابی نگرفتم. کسی میتونه کمک کنه؟
2015-12-11_002034.png
باید از کد زیر استفاده کنی
System.Threading.Thread.CurrentThread.ApartmentSta te = System.Threading.ApartmentState.Unknown;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Forms.FrmLogo Frm_t;
Thread t_Show_Form = new Thread(delegate()
{
Frm_t = new Forms.FrmLogo();
Frm_t.ShowDialog();
});
t_Show_Form.Start();
//عملیات محاسباتی
t_Show_Form.Abort();
Forms.FrmLogin f = new Forms.FrmLogin();
if (f.ShowDialog() == DialogResult.OK)
{
Application.Run(new FrmMain());
}
آخرین ویرایش به وسیله parsdarab : جمعه 20 آذر 1394 در 01:10 صبح
ممنون از پاسختون
کل کدها به این صورته:
private static Thread _LoadingScreenThread;
private static frmPleasewait _ls;
private static bool _shown = false;
public static void ShowLoadingScreen()
{
if (_LoadingScreenThread == null)
{
_LoadingScreenThread = new Thread(new ThreadStart(DoShowLoadingScreen));
_LoadingScreenThread.SetApartmentState(ApartmentSt ate.STA);
_LoadingScreenThread.IsBackground = true;
_LoadingScreenThread.Start();
}
}
private static frmPleasewait _ls;
public static void CloseLoadingScreen()
{
System.Threading.Thread.Sleep(250);
if (_ls != null && _ls.InvokeRequired = null)
{
_ls.Invoke(new MethodInvoker(CloseLoadingScreen));
}
else
{
if (_shown)
{
_shown = false;
Application.ExitThread();
}
if (_LoadingScreenThread != null) _LoadingScreenThread.Interrupt();
try
{
_ls.Close();
_ls.Dispose();
}
catch
{
}
_LoadingScreenThread = null;
}
}
private static void DoShowLoadingScreen()
{
_ls = new frmPleasewait();
_ls.pictureBox1.Enabled = true;
_ls.ShowDialog();
}
private void frmPleasewait_Load(object sender, EventArgs e)
{
this.Activate();
}
}
فقط همون بخش رو تغییر بدم کافیه؟
در واقع یک برنامه هست که اطلاعات رو در بانک ذخیره میکنه. (یک برنامه خیلی ساده اس دیگه)
حالا اگر تعداد داده ها زیاد باشه، بیشتر طول میکشه تا داده جدید ذخیره بشه. من یک فرم ساختم برای نشون داده منتظر بمانید، فقط حالا میخوام زمان بسته شدن فرم به اندازه مدت زمانی باشه که پردازش طول میکشه و انجام میشه، نه اینکه تایمر بذارم و ...
اره اول با نخ فرمو نمایش میدی بعد از اتمام عملیات نخ رو نابود می کنی
این کد باید در ابتدا نوشته بشه توی wpf نمی دونم اما windows application در قسمت main نوشته میشه
به این صورت هست
2015-12-11_005839.png
جیگر اسم فرماتو عوض کن
name space ها رو اضافه کن
دیگه اینقدر بلدم
بحث اینجاس که ما توی WPF چیزی به اسم Current Thread، Form_logo و ... نداریم.
کسی نیست مولتی تردینگ در WPF رو انجام داده باشه؟
البته جای کار داره دیگه حوصلم نشد بیشتر کار کنم
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Window1 Frm_t = new Window1();
this.Dispatcher.Invoke((Action)(() =>
{
Frm_t.Show();
}));
Thread.Sleep(5000);
Frm_t.Close();
}
}
}
بنده انجام دادم، برنامه رو اجرا کردم اما نخ ها عمل نکردن
بنده تا اینجا پیش رفتم. فقط معادل Method Invoker رو میخوام