سلام

نوشته شده توسط
WinFx Developer
من منظورتون رو نمیفهمم حتی المقدور استفاده نکنیم ؟ میشه راجب این توضیح بدید یا اینکه متن انگلیسی این رو اینجا بزارید والا تو این یه 8,9 ماهی که دارم با WPF کار میکنم پروژه مینویسم همچین چیزی ندیدم
شاید بهتر باشه پروژه هایی که نوشتین را یه باز نگری دیگه ای بکنید!
یکی از مباحثی که در WPF جزء مباحث پایه ای می باشد، بحث Layout هست، که در واقع در این بحث، کنترل های کانتینر مطزح می شوند. جهت اطلاع در مورد کنترل های کانتینر و مباحث Layout به این لینک مراجعه کنید.
کامل توضیح دادم . نیز بار ها متذکر شدم که انعطاف پذیر ترین و بعترین کنترل کانتینر، کنترل Grid می باشد و به همین دلیل نیز، کنترل پیش فرض فرم ها به عنوان کنترل بیس پنجره ها ( Winds ) ها می باشد.
شما اگر بتوانید از کنترل های کانتینر و کنترل های دیگری نظیر ScrollViewer به خوبی و به جای خود استفاده کنید، در اکثر مواقع که بیش از 95 درصد موارد ( یا شایدم بیشتر) نیاز به سایز بندی کنترل ها، در WPF نخواهید داشت.
به یک مثال ساده توجه کنید:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition ></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="Name:" VerticalAlignment="Center"></TextBlock>
<TextBox Grid.Column="1">enter your name here</TextBox>
<TextBlock Grid.Row="1" Text="Email:" VerticalAlignment="Center"></TextBlock>
<TextBox Grid.Row="1" Grid.Column="1">enter your Email here</TextBox>
<ScrollViewer Grid.Row="2" Grid.ColumnSpan="2">
<TextBox TextWrapping="Wrap" AcceptsReturn="True">Your Comment</TextBox>
</ScrollViewer>
<Button Name="btnSend" Grid.Row="3" Grid.Column="0">send comment</Button>
</Grid>
این کد، ساده ترین نمونه ای بود که می تونستم براتون مثال بزنم. از این ساده تر نمیشد. هیچ یک از این کنترل ها، با مقادیر Width و Height مقدار دهی نشده اند. نتیجه این است که فرمی خواهید داشت که در مانتیور های مختلف، با رزولوشن های مختلف به خوبی کار خواهد کرد.
البته در این بین، دو خاصیت Min و Max برای پروپرتی های Width و height استثنا می باشند. که می توانید از آن ها نیز بهره بیاری در سایز بندی کنترل های خود ببرید.
در مورد کدی که در شکلی که در پست قبلیتان فرستادید، باید بگم که اشیایی نظیر Ellipse نیز، در ان ها مقادیر Width و height دادن یک امر طبیعی است.
البته باز هم در روشی که مد نظر شما می باشد، یعنی کدی مانند زیر :
<Canvas>
<Ellipse Fill="Red" Width="100" Height="50"/>
</Canvas>
از لحاظ حرفه ای بودن یا بهتره گم از لحاظ اصولی بودن غلط است و بهتر است که برای اشیاء از کنترل ViewBox استفاده گردد.
دلیلش هم این است که این کنترل، اشیاء درون خودش را بر اساس سایزی که خودش دارد Arrange می کند. و در نتیجا با بزرگتر شدن فرم ، کنترل ViewBox نیز بزرگ شده ( از لحاظ سایز) و در نتیجه اشیاء مشا نظیر Ellipse و ... بهتر نمایش داده می شوند. حال اگر این کنترل با کنترل های کانتینری نظیر Grid و ... مخلوط شود، نتیجه همانی خواهد شد که انتظار می رود.
و در پایان هم ذکر چند نکته به زبان شیرین انگلیسی
In WPF, layout is determined by the container that you use. Although there are several
containers to choose from, the “ideal” WPF window follows a few key principles:
• Elements (like controls) should not be explicitly sized. Instead, they grow to fit their
content. For example, a button expands as you add more text. You can limit controls to
acceptable sizes by setting a maximum and minimum size.
• Elements do not indicate their position with screen coordinates. Instead, they are
arranged by their container based on their size, order, and (optionally) other information
that’s specific to the layout container. If you need to add whitespace between
elements, you use theMargin property.'
Tip Hard-coded sizes and positions are evil because they limit your ability to localize your interface, and
they make it much more difficult to deal with dynamic content.
نکات دیگری هم در مورد Layout در WPF و کنترل های کانتینر مطرح می باشد که بحث در مورد آن ها از حوصله این تاپیک خارج است
پ و :
اگر غلط املایی هست، به بزرگی خودتون ببخشید. 48 ساعته درست نخوابیدم.
موفق باشید
مهدی کیانی