PDA

View Full Version : دسترسی به متدها و کنترل های Window اصلی



smt1383
چهارشنبه 04 خرداد 1390, 07:36 صبح
با سلام خدمت دوستان
من در برنامه ام ( WPFApplicatoni1 ) یک فولدر ایجاد کردم به نام CustomControls و برخی از کنترل های جدید را در این فولدر ایجاد کردم. بنابراین کنترل های ایجاد شده در فضای نام WPFApplicatoni1.CustomControls قرار می گیرند. حال من می خواهم از داخل کنترل های ایجاد شده متدهای Window اصلی را فراخوانی کنم و یا به کنترل های آن(که در فضای نام WPFApplicatoni1 قرار دارند) دسترسی پیدا کنم. می خواستم بدانم روش اصولی برای این کار چیست؟
با تشکر

مهدی فرزاد
چهارشنبه 04 خرداد 1390, 09:09 صبح
سلام
مثالی رو که من دادم ملاحظه کنید
البته من این مثال رو بجای استفاده از یوزر کنترل ، از ویندوز استفاده کردم ولی منطقش یکی هست;
راه های دیگه ای هم برای برقراری ارتباط بین دو یوزر کنترل و یا یک یوزر کنترل با Win هم هست یکیش رو در لینک زیر توضیح دادم

http://barnamenevis.org/showthread.php?284978-%D9%86%D8%AD%D9%88%D9%87-%D8%A8%D8%A7%DB%8C%D9%86%D8%AF-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AF%D9%88-%D8%AA%D8%A7-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-%D8%A7%D8%B2-%D8%AF%D8%A7%D8%AE%D9%84-%D8%AF%D9%88-%D8%AA%D8%A7-UserControl

smt1383
چهارشنبه 04 خرداد 1390, 10:29 صبح
ممنون از راهنمایی شما. من مثال شما را دیدم. اما به نظرم این کار اصلاً اصولی نیست. چون شما در اصل Window1 را به عنوان یک پارامتر به Window2 ارسال کرده اید و Window2 به تمامی فیلدهای public مربوط به Window1 دسترسی دارد و این خلاف مفهوم کپسوله سازی است. در برنامه های WinApplication کاری که در این گونه مواقع می کردیم استفاده از رویدادها بود. حال می خواستم بدانم آیا در WPF نیز روش اصولی همان استفاده از رویدادهاست یا روش بهتری نیز وجود دارد؟
اما روش Binding بین دو UserControl به نظر می رسد روش منطقی در WPF باشد زمانی که می خواهیم یک پراپرتی از یک UserControl را به یک پراپرتی از UserControl دیگر Bind کنیم. اما آیا می شود با همین روش یک متد از یک UserControl را به یک متد در یک UserControl دیگر Bind کرد؟ مثلاً با کلیک کردم روی یک دکمه در UserControl2 یک متد در UserControl1 اجرا شود؟

مهدی فرزاد
چهارشنبه 04 خرداد 1390, 10:41 صبح
من با نظر شما مخالفم
شما وقتی فیلدی روpublic میکنید یعنی اجازه دسترسی سایر کلاس ها رو به اون فیلد دادید ( میتونید public نکنید )

در ضمن در مثال من هیچ فیلدی Public نشده بود. من مثال رو فقط برای Button زدم که در WPF به شکل خودکار تمام کنترل های یک پنجره یا یوزر کنترل برای سایر کلاس قابل دسترس هستن

برای فیلد ها من مثالی نزدم
شما برای فیلد ها باید از طریق Property این کار رو انجام بدید نه رویداد!!!!( کجا گفته شده برای تغییر یک فیلد و دسترسی به اون باید از رویداد ها استفاده کرد و این اصولی هست؟)
یعنی با ایجاد یک Property و از طریق اون مقدار یک فیلد رو تغییر بدید (رویداد برای این کار مناسب نیست)

بهترین روش این هست که شما برای هر یوزر کنترل property ها و Event های مناسب ایجاد کنید و از طریق اون مدیریت ویندوزی رو که این یوزر کنترل در اون قرار میگیره رو در اختیار بگیرید

نکته اینکه من به شما رو دسترسی داشتن به یک پنجره و یا ویندوز رو به ویندوزی که اونو فراخونی کرده نشون دادم شما میتوند توی ویندوز هرچی رو خواستید public کنید یا نکنید;

برای روشن شدن مطلب مثال زیر رو ببینید
من تناقضی در شئی گرا بودن نمی بینم

مهدی فرزاد
چهارشنبه 04 خرداد 1390, 11:07 صبح
اما روش Binding بین دو UserControl به نظر می رسد روش منطقی در WPF باشد زمانی که می خواهیم یک پراپرتی از یک UserControl را به یک پراپرتی از UserControl دیگر Bind کنیم. اما آیا می شود با همین روش یک متد از یک UserControl را به یک متد در یک UserControl دیگر Bind کرد؟ مثلاً با کلیک کردم روی یک دکمه در UserControl2 یک متد در UserControl1 اجرا شود؟

دوتا متد Bind نمیشن اگر متدی در یک یوزر کنترل دارید که میخواد در یوزر کنترل دیگه هم اجرا بشه یا میتونید اونو Public کنید ( این اصلا خلاف اصول شئی گرایی نیست دقت کنید ما متد رو public نه فیلد یا سایر متد هایی که ممکنه در اون کلاس باشن و در متد مذکور هم استفاده شده باشن !) یا اینکه برای یوزر کنترل Event تعریف کنید که اون Event متد مورد نظر رو اجرا میکنه و قاعدتن Event تعریف شده Public هست و شما میتونید از طریق این Event کار رو انجام بدید;

Amir Oveisi
پنج شنبه 05 خرداد 1390, 15:08 عصر
smt1383 (http://barnamenevis.org/member.php?7117-smt1383)
مثلاً با کلیک کردم روی یک دکمه در UserControl2 یک متد در UserControl1 اجرا شود؟

علاوه بر توضیحات آقای فرزاد، این نکته رو باید در نظر بگیرید که این جمله ای که نوشتید نشانگر یک منطق اشتباه است.
هر متد، یک رفتار رو برای یک usercontrol پیاده سازی می کنه و رفتار هر usercontrol مختص اونه و نه دیگری! اینکه شما میخواید از یک usercontrol متدی را از داخل یک usercontrol دیگه فراخوانی کنید به این معنی هست که این رفتار بین این دو usercontrol مشترک هست، پس راه مناسب برای اینکه هر دوی این usercontrol ها این رفتار مشترک رو داشته باشند این هست که شما یک usercontrol پایه داشته باشید و usercontrol های مد نظرتون از اون ارث ببرند، اینطوری هر دو usercontrol شما اون رفتار مشترک رو از usercontrol پایه ارث بردن.

davoodrm666_666
شنبه 07 خرداد 1390, 07:54 صبح
شما مي تونيد يك event به يوزر كنترل اضافه كنيد و زماني كه event رخ داد متدي مورد نظر رو داخل اون فراخواني كنيد. البته در صورتي كه از الگوي mvvm استفاده نمي كنيد

smt1383
یک شنبه 08 خرداد 1390, 09:03 صبح
شاید بعضی از دوستان منظور من را درست متوجه نشده باشند. اما با توجه به مطالبی که گفته شد فکر کنم جمع بندی زیر درست باشد:

1) مثلاً می خواهیم در پنجره دوم اگر شرایط خاصی به وجود آمد، تغییری در کنترل های پنجره اصلی بوجود آید یا متد خاصی در پنجره اصلی اجرا شود. مثلاً متن یک label تغییر کند یا هر تغییر دیگر. برای این کار به نظر می رسد بهترین و اصولی ترین کار استفاده از رویدادها است. یعنی باید در پنجره دوم یک رویدادی تعریف کنیم که در شرایط خاص مورد نظر ما این رویداد Rise شود. پنجره اصلی هم این رویداد را Subscribe کند. در نتیجه هر وقت در پنجره دوم شرایط خاص مورد نظر ما ایجاد شد، این رویداد Rise می شود و پنجره اصلی هم متوجه می شود و می تواند هر کاری را انجام دهد مثلاً تغییری در کنترل ها یا متغیرهای فرم بوجود آورد و یا متد خاصی را اجرا کند.

2) می خواهیم با ایجاد هر تغییری در یک پراپرتی از پنجره دوم یک پراپرتی ار پنجره اول نیز همان مقدار را بگیرد و بالعکس. به نظر می رسد در WPF بهترین روش Bind کردن دو پراپرتی باشد.