# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > WPF >  دسترسی به اشیای داخل user control

## aghayex

با سلام
من می خوام به اشیای داخل user control در فرم یا user control دیگر دسترسی داشته باشم.
موقعیکه می خوام user control رو تعریف کنم می تونم به اشیاء اون دسترسی پیدا کنم

 
UserControl usercontrol1= new usercontrol1();
 
(usercontrol1.FindName("titr") asLabel).Content = "بخش تعریف"; 


اما موقعیکه usercontrol لود شد در usercontrol دیگه که اونم لود شده بخوام به اشیا اولی دسترسی داشته بام نمیشه

----------


## مهدی فرزاد

سلام
به نظر من بهتره توی UserControl برای هر یک از اشیای یک خاصیت از نوع پابلیک تعریف کنی و این وظیفه تغییر در حالات اشیاء رو به خاصیت ها بسپاری.قبل از لود کنترلت میتونی خاصیت مورد نظر رو تغییر بدی و این خاصیت تغییر  رو برروی اشیاء توی کنترلت اعمال میکنه

----------


## aghayex

ممنون از جوابتون 
اما قصدم اینه که از روش های غیر حرفه ای استفاده نکنم و قانون کپسولیشن رو رعایت کنم

----------


## مهدی فرزاد

بازم سلام آقای X
فکر کنم من منظورم رو درست نگفتم
ببینید دوست عزیز این چیزی که من میگم تناقضی با حرفه ای نوشتن برنامه نداره
من این مسئله رو با یک مثال به شکل دیگه بیان میکنم اگه اشتباه فکر میکنم بگیدتا به معلوماتم اضافه بشه
اگه دقت کرده باشید هر فرم ویا پنجره ای که در برنامتون میسازید دارای یک سری خصوصیات مثل Titel ، Height , Widthو غیره هست که شما با تنظیم اونها یک سری از حالات فرمتون چه در ظاهر و چه در کارایی فرم رو تغییر می دید همچنین کنترل هایی مثل TextBox مثلا خاصیتی مثل Text دارن و خواص آنها اکثرا به صورت public هستند و شما وقتی از اونها یک نمونه میسازید میتونید به خواص اونها دسترسی داشته باشید.خوب فرقی نمی کنه شما چه یک کلاس جدید بسازید یا یک کنترل جدید بسازید بهتره که برای اون خاصیت های مورد نظر رو هم تولید کنید تا بتونید با استفاده از اونها تغییرات مورد نظر رو اعمال کنید.اگه من اشتباه میکنم بگید تا استفاده کنم

----------


## exlord

> بازم سلام آقای X
> فکر کنم من منظورم رو درست نگفتم
> ببینید دوست عزیز این چیزی که من میگم تناقضی با حرفه ای نوشتن برنامه نداره
> من این مسئله رو با یک مثال به شکل دیگه بیان میکنم اگه اشتباه فکر میکنم بگیدتا به معلوماتم اضافه بشه
> اگه دقت کرده باشید هر فرم ویا پنجره ای که در برنامتون میسازید دارای یک سری خصوصیات مثل Titel ، Height , Widthو غیره هست که شما با تنظیم اونها یک سری از حالات فرمتون چه در ظاهر و چه در کارایی فرم رو تغییر می دید همچنین کنترل هایی مثل TextBox مثلا خاصیتی مثل Text دارن و خواص آنها اکثرا به صورت public هستند و شما وقتی از اونها یک نمونه میسازید میتونید به خواص اونها دسترسی داشته باشید.خوب فرقی نمی کنه شما چه یک کلاس جدید بسازید یا یک کنترل جدید بسازید بهتره که برای اون خاصیت های مورد نظر رو هم تولید کنید تا بتونید با استفاده از اونها تغییرات مورد نظر رو اعمال کنید.اگه من اشتباه میکنم بگید تا استفاده کنم


منظور دوستمون اینکه برای چیزایی که میخواین خارج از usercontrol دسترسی داشته باشین property تعریف کنین ... 
public string titrContent 
        {
            get { return this.titr.content; }
            set { this.titr.content = value; }
        }

----------


## aghayex

> نوشته شده توسط *Mehdi550u*  
> _بازم سلام آقای X
> فکر کنم من منظورم رو درست نگفتم
> ببینید دوست عزیز این چیزی که من میگم تناقضی با حرفه ای نوشتن برنامه نداره
> من این مسئله رو با یک مثال به شکل دیگه بیان میکنم اگه اشتباه فکر میکنم بگیدتا به معلوماتم اضافه بشه
> اگه دقت کرده باشید هر فرم ویا پنجره ای که در برنامتون میسازید دارای یک سری خصوصیات مثل Titel ، Height , Widthو غیره هست که شما با تنظیم اونها یک سری از حالات فرمتون چه در ظاهر و چه در کارایی فرم رو تغییر می دید همچنین کنترل هایی مثل TextBox مثلا خاصیتی مثل Text دارن و خواص آنها اکثرا به صورت public هستند و شما وقتی از اونها یک نمونه میسازید میتونید به خواص اونها دسترسی داشته باشید.خوب فرقی نمی کنه شما چه یک کلاس جدید بسازید یا یک کنترل جدید بسازید بهتره که برای اون خاصیت های مورد نظر رو هم تولید کنید تا بتونید با استفاده از اونها تغییرات مورد نظر رو اعمال کنید.اگه من اشتباه میکنم بگید تا استفاده کنم_


صحبت شما درسته  اما من يه چيزي شبيه به کد زير مي خام . در اين کد من مي تونم به کنترل هاي پنجره ويندوز (‌فرم ) دسترسي داشته بام

Window window = Application.Current.MainWindow;
(window.FindName("LayoutRoot") as Grid).IsEnabled = false;

در اين کد در يک لحظه من يه ارتباط با ويندوز ( فرم ) برقرار مي کنم و کارمو که انجام دادم بحث تموم مي شه و ديگه من يه شي ندارم که در طول برنامه براي همه اجزاي برنامه قابل دسترسي باشه



> نوشته شده توسط exlord 
> منظور دوستمون اینکه برای چیزایی که میخواین خارج از usercontrol دسترسی داشته باشین property تعریف کنین ...


این کار رو که شما و دوستمون گفتن اگه صرف نظر بکنیم از مباحث بالا فقط برای حالتی هست که من بخوام به یک یا چند شی از کنترل دسترسی داشته باشم نه 25 شی

----------


## مهدی فرزاد

ببینید دوست من مسئله دوچیزه ، اگه شما میخواید حرفه ای بنویسید و  قوانین شی گرا بودن رو رعایت کنید راه همونه که ما گقتیم . فرقی نمیکنه چه 1  Property داشته باشی چه 25تا.این نکته رو درنظر داشته باشید که تمام کنترل های NEt. هم از همین قاعده پیروی میکنن و بعضی ها هم بیش از 25 Property دارن.
و اینکه اگه شما بخواید مثلا کلاسهایی برای ایجاد ارتباط با جداول بانک اطلاعاتی از روش Linq ایجاد کنید شاید مجبور باشید بیش از 100 خاصیت یا Property ایجاد کنید.
پس از کد نویسی زیاد فرار نکنید زیاد نوشتن دلیل نا درست یا نا مناسب بودن روش و کد ها نیست
اما خوب اگه این جوری نوشتن رو نمی پسندید بحث چیز دیگست. به هر حال موفق باشید و از اینکه با شما آشنا شدم خوشحالم.
 :لبخند:

----------


## aghayex

> ببینید دوست من مسئله دوچیزه ، اگه شما میخواید حرفه ای بنویسید و قوانین شی گرا بودن رو رعایت کنید راه همونه که ما گقتیم . فرقی نمیکنه چه 1 Property داشته باشی چه 25تا.این نکته رو درنظر داشته باشید که تمام کنترل های NEt. هم از همین قاعده پیروی میکنن و بعضی ها هم بیش از 25 Property دارن.
> و اینکه اگه شما بخواید مثلا کلاسهایی برای ایجاد ارتباط با جداول بانک اطلاعاتی از روش Linq ایجاد کنید شاید مجبور باشید بیش از 100 خاصیت یا Property ایجاد کنید.
> پس از کد نویسی زیاد فرار نکنید زیاد نوشتن دلیل نا درست یا نا مناسب بودن روش و کد ها نیست
> اما خوب اگه این جوری نوشتن رو نمی پسندید بحث چیز دیگست. به هر حال موفق باشید و از اینکه با شما آشنا شدم خوشحالم.


با جستجویی که کردم فهمیدم که حرف شما صحیح و اصولیتره اما می خواستم بحث شما رو اجرا کنم به مشکل برخوردم
متغیری در فرم مقصد تعریف کردم به صورت زیر "

public string temp
{
get;
set;
}

اما در قرمی که می خوام مقداری به این متغیر بدم به مشکل برخوردم
مثلا در سی شارپ این کده:

form 1 f2=new form1();
f2.temp="dd";

----------


## مهدی فرزاد

كدي كه شما براي ايجاد خاصيت نوشتيد ناقصه 
اول به من بگيد ميخوايد مثلا اين خاصيت temp چه كاري براي شما انجام بده تا دقيقا راهنماييتون كنم
من الان جايي هستم كه دسترسيم به اينترنت محدوده ولي تا چند ساعت ديگه دونمونه مثال ساده و كار راه بنداز براتون ميگم اميدوارم مفيد واقع بشه

----------


## مهدی فرزاد

من دو حالت رو براي شما مثال ميزنم
در حالت اول فرض ميكنم در آينده نيازي نداريم كه بدونيم خاصيت ايجاد شده دراري چه مقداري هست پس از get صرف نظر ميكنيم

توي Form2 يك Button داريم كه ميخواهيم موقع لود فرم مخفي بشه پس اين خاصيت رو براي فرم 2 ايجاد ميكنيم
public bool ButtonHide
        {
            set
            {
                if (value == true)
                    button1.Hide();
            }
        }

حالا توي فرم 1

Form2 f2 = New Form2();
f2.ButtonHide = true;
f2.Show();

و به همين راحتي خاصيت ما عمل ميكنه

اما بعضي وقتها شما نياز داري كه بدوني خاصيت شما داراي چه مقداري هست
پس كد هاي فرم 2 رو به شكل زير اصلاح ميكنيم
و اين بار نياز به يه متغيير از نوع bool داريم (دقت كنيد خاصيت ما هم نوعش bool )
توي اين مثال من ديگه توي قسمت set نميگم button محفي شه توي فرم لود اينو با بررسي مقدار خاصيت ميگم(جهت آشنايي با نوع ديگه استفاده ار خاصيت ها)
private bool bolButtonHide;
               private void Form2_Load(object sender, EventArgs e)
        {
            if (ButtonHide == true)
              this.button1.Hide();
        }
        public bool ButtonHide
        {
            get
            {
                return bolButtonHide;
            }
 
            set
            {
                bolButtonHide = value;
 
            }
        }
و دوباره همون دستور قبلي رو در فرم 1 مينويسم

جواب يكيه

و اين مسئله رو شما ميتونيد براي نوع هاي string و int و . . . هم بكار ببريد
و همچنين در قسمت get هم بر حسب نياز ميتونيد دستوراتي رو درج كنيد.
بحث Property خيلي مفصله اميدوارم اين توضيح هاي ساده و ناقص كه صرفا براي بيان منظور بود مفيد بوده باشند

----------


## aghayex

با سلام
دوست عزیر این چیزی که نوشتید برا سی شارپ و ... کاملا درسته اما برا wpf قبول نمی کنه  :خیلی عصبانی:

----------


## مهدی فرزاد

بله دقيقا درسته اين فقط يك مثال بود كه شما روش كار رو ببينيد  در اين مثال در wpf شما براي محفي كردن button بايد از خاصيت visiblity اون استفاده كنيد.

به نظر من شما دقيقا بگيد ميخوايد چه كاري رو با اين خاصيت ها انجام بديد تا من كد مناسب اون براي WPF رو به شما بدم

----------


## مهدی فرزاد

در دو مثال قبلي براي اينكه توي WPF كار كنه به جاي button1.Hide(); بگذار button1.Visibility = System.Windows.Visibility.Hidden; ديگه تفاوتي نداره و كاملا جواب ميده

----------


## aghayex

من در همون اول تاپیک گفتم تو wpf من مشکلی با ارتباط با windows ها ندارم و چه هنگام لود کردن ویندوز و چه هموقعی که ویندوز لود شده می تونم به تمام کنترل های اون دسترسی داشته باشم و همینطور به کنترل های یه user control که می خوام لودش کنم اما به کنترل های یه یوزر کنترل که لود شده دیگه نمی تونم دسترسی داشته باشم
کد دسترسی به کنترل های ویندوز یا یوزر کنترل :

UserControl usercontrol1= new usercontrol1(); 
(usercontrol1.FindName("titr") asLabel).Content = "بخش تعریف";

----------


## مهدی فرزاد

من یکم گیج شدم !! میشه دقیقتر بگی میخوای چکار کنی؟ اگه تعریف UserControl رو توی فضای کلاس فرمت انجام بدی توی همه جای کلاس به خواص و توابع Public اون دسترسی داری ، شاید من درست نمیگیرم چه خبره!! :متفکر:  :ناراحت:  راستی یه پیام برات دادم خوندی؟؟؟

----------


## aghayex

اینم یه نمونه ساده

----------


## مهدی فرزاد

یه بخشی رو برات اصلاح کردم ولی کارهایی که میخوای انجام بدی رو خیلی راحت تر میشه انجام داد فردا سر فرصت برات یه نمونه درست میکنم حالا اسم دانش آموز رو یا کلاس یا معلم رو تایپ کن و ثبت رو بزن و نتیجه رو ببین  :چشمک:

----------

