معرفی
تمام ویژگی های کنترل های WPF از کلاس FrameworkElement مشتق می شوند. از اسامی میتوان نتیجه گرفت که Width عرضی را که میخواهیم برای کنترل تنظیم کنیم مشخص میکند و دو ویژگی دیگر MinWidth و MaxWidth ویژگیهای محدودیت برای کنترل width هستند. در هنگام استفاده از این ویژگی ها ممکن است مواردی وجود داشته باشد که مایلم در اینجا به آنها بپردازم.
مورد 1
هر سه تنظیم شده اند و عرض در بین هر سه کمتر است. در این مورد خاص، MinWidth اولویت خواهد داشت زیرا عرض تنظیم شده حتی کمتر از عرض منی است. به عنوان مثال در قطعه کد زیر عرض کنترل پس از بهروزرسانی طرحبندی MinWidth خواهد بود.
- MinWidth="50" Width="20" MaxWidth="2in"
مورد 2
هر سه تنظیم شده اند و Width در بین هر سه حداکثر است. در این مورد خاص، MaxWidth اولویت خواهد داشت زیرا عرض تنظیم حداکثر است. به عنوان مثال در قطعه کد زیر، عرض رندر شده کنترل MaxWidth خواهد بود.
- MinWidth="50" Width="300" MaxWidth="2in"
مورد 3
هر سه تنظیم شده اند و Width در محدوده محدودیت های MinWidth و MaxWidth قرار دارد. در این مورد خاص مقدار Widths برای کنترل تنظیم می شود. به عنوان مثال در قطعه کد زیر، عرض رندر شده کنترل، مقدار Width خواهد بود:
- MinWidth="50" Width="300" MaxWidth="2in"
مورد 4
فقط MinWidth و MaxWidth تنظیم شده است. در این حالت اگر حداکثر پهنای کنترل بزرگتر از عرض محتویات باشد، اولویت به عرض محتویات داده می شود، زیرا در حالت زیر عرض کنترل به عرض «نام تو چیست» خواهد بود.
- <Button Content="What is your name" x:Name="tb" HorizontalAlignment="Center" MinWidth="40" MaxWidth="300"/>
اما اگر MaxWidth کمتر از عرض محتویات باشد، در آن صورت عرض حداکثر MaxWidth خواهد بود. همانطور که در مورد زیر عرض کنترل روی 60 تنظیم می شود.
- <Button Content="What is your name" x:Name="tb" HorizontalAlignment="Center" MinWidth="40" MaxWidth="60"/>
اکنون می خواهم یک ویژگی دیگر را که باید با آن آشنا باشیم و آن ActualWidth است بحث کنم . این ویژگی پس از انجام تمام رندر توسط سیستم layout تنظیم می شود. این مقادیر می توانند با ویژگی Height و Width که هنگام ایجاد یک کنترل تعریف می کنیم متفاوت باشند.
همانطور که در MSDN بیان شده است « از آنجایی که ActualWidth یا ActualHeigth مقادیر محاسبه شده هستند، باید توجه داشته باشید که ممکن است تغییرات متعدد یا افزایشی گزارش شده در آن در نتیجه عملیات مختلف توسط سیستم طرحبندی وجود داشته باشد. سیستم چیدمان ممکن است فضای اندازه گیری مورد نیاز برای عناصر فرزند، محدودیت های عنصر والد و غیره را محاسبه کند. ”
وقتی میخواهیم ویژگی width را برای کنترل به عرض کنترل دیگری به روش زیر متصل کنیم، مشخص کردم که ویژگی width واقعی مفید است.
- <Button Content="What is your name" x:Name="tb" HorizontalAlignment="Center" MinWidth="40" MaxWidth="60"/>
- <Button Width="{Binding ElementName=tb,Path=ActualWidth}" Grid.Column="1" Height="{Binding ElementName=tb,Path=ActualHeight}"></Button>
موارد زیادی وجود دارد که برای ایجاد طرح بندی برای سایر کنترل ها به عرض کنترل در زمان اجرا نیاز داریم. ما واقعاً نمیتوانیم به ویژگی Width کنترل تکیه کنیم همانطور که در سناریوهای قبلی دیدیم که در آن Width با عرض واقعی که کنترل پس از انجام طرحبندی به دست میآورد متفاوت است. ما نمیتوانیم در مورد دریافت ActualWidth هر کنترلی در پنجره درست بعد از متد InitializeComponent() مطمئن باشیم.
ویژگی ActualWidth فقط باید پس از اجرای رویداد LayoutUpdated پنجره بازیابی شود. همانطور که در زیر نشان داده شده است باید یک کنترلر متصل به این رویداد داشته باشیم.
- public MainWindow()
- {
- InitializeComponent();
- this.LayoutUpdated += MainWindow_LayoutUpdated;
- }
- void MainWindow_LayoutUpdated(object sender, EventArgs e)
- {
- // get the ActualHeight/ActualWidth of the control here
- }
لطفاً توجه داشته باشید که من در این مقاله یک مثال از Width را در اینجا آوردهام. تمامی سناریوها برای ویژگی Height نیز قابل اجرا هستند.