PDA

View Full Version : مشکل در سريالايز



taha mahdi
یک شنبه 03 بهمن 1389, 07:09 صبح
با سلام
فرض کنيد يک باتن داريم و با رويداد کليک آن کار خاصي را انجام مي‌دهيم
حالا آن را با سريالايز کردن save مي‌کنيم و برنامه را دوباره اجرا مي‌کنيم و آن را open مي‌کنيم

مشکل اينجا است که همچي درست است جز اينکه آن رويداد ديگر کار نمي‌کند

چرا؟

mahdi7s
دوشنبه 04 بهمن 1389, 16:41 عصر
سلام

چون شما XAML را سریالی کردید و این شامل Code Behind نمیشه
برای حل این مشکل شما باید کدها را دستی به XAML تان بچسبانید که در این صورت اگر از یک الگوی خوب مثل MVVM استفاده کرده باشید فقط کافی است DataContext دکمه تان را پس از دی سریالیز کردن به کلاس مرتبطش تخصیص بدهید(توجه کنید که در این الگو دیگر رویدادها معنی ندارند و بجای آن ها کامندها وجود دارند) و در غیر اینصورت شما باید رویداد مرتبط به دکمه را در زمان اجرا هندل کنید...

موفق باشید

taha mahdi
دوشنبه 04 بهمن 1389, 20:15 عصر
با تشکر از شما

مي‌شود بفرماييد منظورتان از هندل کردن رويداد دکمه در زمان اجرا چيست؟ و من را بيشتر روشن کنيد

لطفا با يک مثال بفرماييد

mahdi7s
دوشنبه 04 بهمن 1389, 22:43 عصر
منظورتان از هندل کردن رويداد دکمه در زمان اجرا چيست؟
این چندان ربطی به WPF ندارد ولی این (http://izip.ir/download.php?id=DF03EA131)سمپل ساده که براتون آماده کردم کاملا این را نشان می دهد...

موفق باشید

taha mahdi
سه شنبه 05 بهمن 1389, 21:05 عصر
با سلام و عرض تشکر

فکر مي‌کنم بهتر است سوالم را کامل تر بپرسم

دوست عزيز برنامه‌ي من يک اينترفيس خاصي دارد که در آن پر از باتن و کامپننت‌هاي ديگر است که آن هم به صورت پويا و متغير مي‌باشد

حالا در نظر دارم قابليت ذخيره برنامه را به کاربر بدهم تا بتواند بعدا هم به آن مراجعه کند و دوباره داده‌ها را پر نکند

براي اين کار تمام تغيراتي که کاربر در ظاهر برنامه ايجاد مي‌کند در يک Grid قرار دارد که در نهايت با زدن دکمه save اين Grid را به صورت زير ذخيره و لود مي‌کنم

ذخيره

private void MenuItemsave_Click(object sender, RoutedEventArgs e)
{
try
{
System.IO.FileStream Fs = new System.IO.FileStream(@"E:\XamlMyDesign.Xml", System.IO.FileMode.CreateNew);
System.Windows.Markup.XamlWriter.Save(mygrid, Fs);
Fs.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

لود

private void MenuItemopen_Click(object sender, RoutedEventArgs e)
{
try
{
OpenFileDialog Fd = new OpenFileDialog();
Fd.ShowDialog();
string LoadedFileName = Fd.FileName;

//Load the file
System.IO.FileStream Fs = new System.IO.FileStream(@LoadedFileName, System.IO.FileMode.Open);
Grid grdToLoad = new Grid();

grdToLoad = System.Windows.Markup.XamlReader.Load(Fs) as Grid;

mygrid.Children.Add(grdToLoad);

Fs.Close();
}
catch (Exception a)
{
MessageBox.Show(a.Message);
}

}



اما همانطور که گفتم ديگر باتن‌ها رويداد خود را از دست مي‌دهند و برنامه نيز آن را مانند يک پوسته‌ي ظاهري با آن رفتار مي‌کند و آن را تشخيص نمي‌دهد

لطفا راهنمايي بفرماييد که گير هستم

mahdi7s
چهارشنبه 06 بهمن 1389, 13:41 عصر
...همانطور که گفتم ديگر باتن‌ها رويداد خود را از دست مي‌دهند...
من هم دقیقا همین را توضیح دادم...

شما و برنامه تان هر دو می دونید که کدام رویداد مربوط به کدام دکمه است-درسته؟ -> فقط کافیه بعد از بارگذاری کنترل های جدید(برای شما همان گرید و کودکانش! از جمله دکمه هایتان) را توسط نامشان پیدا و بعد رویداد مرتبط هر کنترلر را به متدش بچسبانید(این دقیقا در کدی که گذاشتم معلومه /فقط من دیگر سریالی نکردم).
یعنی شما فرض کنید در کدی که گذاشتم متد GetButton یک رشته (نام دکمه) بگیرد و سپس دکمه را برگرداند(برای پیدا کردن دکمه کافی است از متد FindName در شی گریدی که دی سریالیز کردید استفاده کنید)

موفق باشید