سئوالات و مباحث WPF

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
استاد ، منبع انگلیسی برای من اون هم وقتی با کنترل ها و اساس های مهم در wpf و xml آشنا نیستم ، سخت هه . باعث سردرگمی ام میشه . هم خیلی هم طول میکشه .
منبع انگلیسی برای من که انگلیسی ام هم قوی نیست برای زمانی هه که یه درک کلی از ساختارهای کنترل ها و کلا ساختارهای اساسی در wpf و xml ، اطلاعاتی بدست بیارم .
بنابراین شما یه منبع pdf (یا غیر از pdf) خوب به زبان فارسی برای wpf و xml و مخصوصا اینکه ساختارهای کنترل ها (مثل همین x:key و از این قبیل موارد) را توضیح بده ، میشناسین ، معرفی کنین ؟ (اگه توضیحات style ها و template ها باشن که خیلی خوب میشه) .
ممنون
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
استاد ، الان وقتی کد زیر نوشته بشه یا بنویسیم :

کد:
<Window x:Class="WPF_Practice.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Practice"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
      
    </Grid>
</Window>

این کد برابر با اینه که مقدار پروپرتی Content از Window را برابر با شی Grid بگیریم؟ درسته؟
یعنی وقتی در کد xml ، یک content (منظورم کانتنت در کد xml هست) مینویسیم ، برابر با اینه که پروپرتیِ Content از اون کنترل را مقداردهی کنیم . درسته؟
تمام کدهای xml در wpf ، این طور تفسیر میشن ؟
من کلا نیاز به یه دید کلی و بیشتر برای کدهای xml و مخصوصا جزئیات کنترل هاش دارم تا دقیق تر بدونم قضیه اش چجوری هه .
خیلی ممنون استاد .
 

the_king

مدیرکل انجمن
استاد ، الان وقتی کد زیر نوشته بشه یا بنویسیم :

کد:
<Window x:Class="WPF_Practice.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Practice"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
     
    </Grid>
</Window>

این کد برابر با اینه که مقدار پروپرتی Content از Window را برابر با شی Grid بگیریم؟ درسته؟
بله.

یعنی وقتی در کد xml ، یک content (منظورم کانتنت در کد xml هست) مینویسیم ، برابر با اینه که پروپرتیِ Content از اون کنترل را مقداردهی کنیم . درسته؟
تمام کدهای xml در wpf ، این طور تفسیر میشن ؟
من کلا نیاز به یه دید کلی و بیشتر برای کدهای xml و مخصوصا جزئیات کنترل هاش دارم تا دقیق تر بدونم قضیه اش چجوری هه .
خیلی ممنون استاد .
خیر. دلیلش هم که میدونید. قبلا چند بار توضیح دادم که حکم هایی که از روی مثال ها اختراع می کنید به چه دلیلی اشتباه هستند. شرح استدلال استقرایی رو بخونید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بله.


خیر. دلیلش هم که میدونید. قبلا چند بار توضیح دادم که حکم هایی که از روی مثال ها اختراع می کنید به چه دلیلی اشتباه هستند. شرح استدلال استقرایی رو بخونید.

بله .
استدلال ام مخصوصا برای چیزهایی که تازه دارم یاد میگیرم ، به همین استدلال بیشتر میخوره . :green:
ولی استاد ، من لازم دارم بدونم که اینها طبق چه قانونی پیش میرن و کد نوشته میشه . یعنی توی کدهای xml ، الان حس اون زمانی را دارم که داشتم سی شارپ را تازه یاد مگرفتم . نمیدونستم کجا ، چه کدی باید بنویسم و کدها طبق چه قوانینی پیش میرن . یعنی زمانی که این پست را در سی شارپ دادم :

گفتگو هایی در باب سی شارپ

الان مثلا در کد زیر :
کد:
<Window x:Class="WPF_Practice.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Practice"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
    
    </Grid>
</Window>

با خودم گفتم که چجوری شد که Grid اونجا تعریف شد؟
بعد فهمیدم که وقتی اگه پروپرتی Content را در تگِ شروع مقداردهی نکنیم ، و در بین تگ (یعنی به عنوان content در xml) کدی را بنویسیم (مثل کد grid که بین تگ window نوشته شد) ، اون کد (کد grid) ، به عنوان مقدار پروپرتی Content در wpf تفسیر میشه .
خوب همین اش برام خیلی مهمه . دونستنِ همین ، خیلی توی درک کد و تجزیه و تحلیلِ کدهای wpf ام تاثیر داره . ولی چون همچین چیزی را نمیدونستم ، نه توی منابع انگلیسی و نه توی منابع فارسی نمیدونستم دنبال چه چیز باید بگردم .

یا اینکه مثلا در کد زیر :
کد:
<Window x:Class="WpfTutorialSamples.Styles.SimpleStyleSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SimpleStyleSample" Height="200" Width="250">
    <StackPanel Margin="10">
        <StackPanel.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Foreground" Value="Gray" />
                <Setter Property="FontSize" Value="24" />
            </Style>
        </StackPanel.Resources>
        <TextBlock>Header 1</TextBlock>
        <TextBlock>Header 2</TextBlock>
        <TextBlock Foreground="Blue">Header 3</TextBlock>
    </StackPanel>
</Window>

در این کد ، خط مربوط به Style ، یعنی خط <Style TargetType="TextBlock"> را متوجه نشدم چرا باید اونجا تعریف بشه؟
یعنی چرا باید Style ، درون StackPanel.Resources تعریف بشه؟
توی سی شارپ که پروپرتیِ Resources ، شی ای از ResourceDictionary میخواد . پس در کد بالا ، چرا درون تگ StackPanel.Resources ، محتوای Style را میده؟
یکی از مشکلات مهم ام اینه که نمیدونم تفسیر wpf ، از کدهای xml اش چجوری هه؟ (باید جواب این سئوال را دونست تا طبق خواسته ی wpf بشه کدهای xml را نوشت دیگه) .
 

the_king

مدیرکل انجمن
بله .
استدلال ام مخصوصا برای چیزهایی که تازه دارم یاد میگیرم ، به همین استدلال بیشتر میخوره . :green:
ولی استاد ، من لازم دارم بدونم که اینها طبق چه قانونی پیش میرن و کد نوشته میشه . یعنی توی کدهای xml ، الان حس اون زمانی را دارم که داشتم سی شارپ را تازه یاد مگرفتم . نمیدونستم کجا ، چه کدی باید بنویسم و کدها طبق چه قوانینی پیش میرن . یعنی زمانی که این پست را در سی شارپ دادم :

گفتگو هایی در باب سی شارپ

الان مثلا در کد زیر :
کد:
<Window x:Class="WPF_Practice.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Practice"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
   
    </Grid>
</Window>

با خودم گفتم که چجوری شد که Grid اونجا تعریف شد؟
بعد فهمیدم که وقتی اگه پروپرتی Content را در تگِ شروع مقداردهی نکنیم ، و در بین تگ (یعنی به عنوان content در xml) کدی را بنویسیم (مثل کد grid که بین تگ window نوشته شد) ، اون کد (کد grid) ، به عنوان مقدار پروپرتی Content در wpf تفسیر میشه .
خوب همین اش برام خیلی مهمه . دونستنِ همین ، خیلی توی درک کد و تجزیه و تحلیلِ کدهای wpf ام تاثیر داره . ولی چون همچین چیزی را نمیدونستم ، نه توی منابع انگلیسی و نه توی منابع فارسی نمیدونستم دنبال چه چیز باید بگردم .
شما قواعد رو اختراع می کنید، قرار نیست از روی مثال قواعد اختراع کنید، باید قواعد رو بخونید. با دو سه خط خوندن از هر مطلبی بهتر از این در نمیاد. حرف هم که کلا گوش نمی کنید.

در این کد ، خط مربوط به Style ، یعنی خط <Style TargetType="TextBlock"> را متوجه نشدم چرا باید اونجا تعریف بشه؟
یعنی چرا باید Style ، درون StackPanel.Resources تعریف بشه؟
چون Style از المان های قابل قبول در resource dictionary ئه.
Overview of XAML resources
styles.png

شما بجای اینکه WPF رو از روی مستنداتش یاد بگیرید دارید نمونه های XML رو تفسیر می کنید تا برای خودتون قاعده استخراج کنید، طبعا بیشتر تفسیر هاتون هم غلط در میاد.

توی سی شارپ که پروپرتیِ Resources ، شی ای از ResourceDictionary میخواد . پس در کد بالا ، چرا درون تگ StackPanel.Resources ، محتوای Style را میده؟
یکی از مشکلات مهم ام اینه که نمیدونم تفسیر wpf ، از کدهای xml اش چجوری هه؟ (باید جواب این سئوال را دونست تا طبق خواسته ی wpf بشه کدهای xml را نوشت دیگه) .
چون در مستنداتش واضح و مشخص نوشته باید اونجا نوشته بشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شما قواعد رو اختراع می کنید، قرار نیست از روی مثال قواعد اختراع کنید، باید قواعد رو بخونید. با دو سه خط خوندن از هر مطلبی بهتر از این در نمیاد. حرف هم که کلا گوش نمی کنید.


چون Style از المان های قابل قبول در resource dictionary ئه.
Overview of XAML resources
مشاهده پیوست 113399

شما بجای اینکه WPF رو از روی مستنداتش یاد بگیرید دارید نمونه های XML رو تفسیر می کنید تا برای خودتون قاعده استخراج کنید، طبعا بیشتر تفسیر هاتون هم غلط در میاد.


چون در مستنداتش واضح و مشخص نوشته باید اونجا نوشته بشه.

آها
خیلی ممنون استاد .
الان مثلا من نمیدونستم منظور از entry که نوشت (در همون خط که قرمز کردین) ، همون به عنوان محتوا (content در xml) هست .

الان استاد ، برای اینکه تفسیر کدهای xml در wpf را متوجه بشم (مخصوصا میخوام control template ها را بصورت دقیق و کامل یاد بگیرم تا کنترلی با شکل کاملا دلخواهم را ایجاد کنم) ، کافی هه که همه ی بخش های لینک زیر را از اول بخونم؟ :

XAML overview - WPF

یعنی بعد از خوندن لینک بالا (که بخش xaml overview بود) ، بخش های بعدیش یعنی define resource و style and template (که خودش شامل 3 زیر مجموعه هست) را بخونم ، کافی هستن؟
بعد اینکه استاد ، انگار چند تا template داریم . مثلا control template و data template . باز تمپلیت دیگه ای داریم؟ تفاوت اینها چی اند؟
خیلی ممنون .
 

the_king

مدیرکل انجمن
آها
خیلی ممنون استاد .
الان مثلا من نمیدونستم منظور از entry که نوشت (در همون خط که قرمز کردین) ، همون به عنوان محتوا (content در xml) هست .
entry یعنی مدخل، چرا باید منظورش content باشه؟ entry یعنی اقلامی که وارد dictionary میشن، مثل همون System.Collections.DictionaryEntry .
داره در مورد یک dictionary صحبت می کنه و XAML resources.

الان استاد ، برای اینکه تفسیر کدهای xml در wpf را متوجه بشم (مخصوصا میخوام control template ها را بصورت دقیق و کامل یاد بگیرم تا کنترلی با شکل کاملا دلخواهم را ایجاد کنم) ، کافی هه که همه ی بخش های لینک زیر را از اول بخونم؟ :

XAML overview - WPF
یعنی بعد از خوندن لینک بالا (که بخش xaml overview بود) ، بخش های بعدیش یعنی define resource و style and template (که خودش شامل 3 زیر مجموعه هست) را بخونم ، کافی هستن؟
overview یعنی اجمالی، کلی، جزئیات زیادی نداره، طبعا کافی نیست. کل مطالب نوشته شده در مورد WPF رو بخونید، نه فقط overview

بعد اینکه استاد ، انگار چند تا template داریم . مثلا control template و data template . باز تمپلیت دیگه ای داریم؟ تفاوت اینها چی اند؟
خیلی ممنون .
وارثین FrameworkTemplate رو (Derived) ببینید :
FrameworkTemplate Class
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
attributes ها را اگه بخوایم مثال بزنیم ، شبیه پروپرتی ها در سی شارپ هستند؟ (همونطور که گفتید ، قصد ندارم xml را با سی شارپ مقایسه کنم . ولی میگم اگه شباهتی بخوایم در نظر بگیریم ، همچین شباهتی هست؟)

استاد ، خوب اینی که گفتم ، درسته دیگه .
اینجا بهش اشاره کرد :

XAML overview - WPF

کد:
Attribute syntax (properties)
Properties of an object can often be expressed as attributes of the object element.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بله.


خیر. دلیلش هم که میدونید. قبلا چند بار توضیح دادم که حکم هایی که از روی مثال ها اختراع می کنید به چه دلیلی اشتباه هستند. شرح استدلال استقرایی رو بخونید.

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

کد:
<Window x:Class="WPF_Practice.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Practice"
        mc:Ignorable="d"
        Title="MainWindow"  Width="900" Height="600">

    <Window.Content>
        <Grid>
           
        </Grid>
    </Window.Content>
   
</Window>

استاد ، از این دست کدها که مفسر اون را خلاصه میکنه و الان به یادتون میاد را میتونین کلا بهم بگین؟
چون خیلی از این دست کدها (ی کامل) به یادگیری ام کمک میکنه (مثل قضیه ی this در کدهای سی شارپ که معمولا نمیذاره و ...) . وگرنه توی ذهنم صرفا حفظ میکنم که باعث میشه زود اون مطلب را فراموش کنم .
خیلی ممنون .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بعد هم متوجه شدم که برای آرایه ها یا کالکشن ها در مفسر xml در wpf ، فقط کافی هه که اعضای اون آرایه را به عنوان محتوا (content در xml) بدیم . نه کل آرایه را . (برای خودم در آینده میگم) .
مثلا اگه آیتم های مربوط به یک کنترل combobox را بخوایم پر کنیم ، فقط کافی هه اعضای اون آیتم ها (مثل عدد ، رشته ، یا هر آبجکت دیگه ای) را بنویسیم (و طبعا چون این اعضا ، خودشون شی هستن و شی ها را داخل تگ ها میریزیم ، بنابراین هر کدوم از این اشیا یعنی هر کدوم از اعضای پروپرتیِ آیتم را داخل تگ ای مشخص میکنیم (مشخص هست که نام تگ ، باید برابر با نوع داده ای باشه) و محتوای اون تگ ها را (شی ای از اون نوع داده ای) مقداردهی میکنیم . یعنی :

کد:
<ComboBox Margin="10,47,0,0">
    <ComboBox.Items>
        <System:Int32>10</System:Int32>
        <System:Int32>20</System:Int32>
        <System:String>سلام</System:String>
        <CheckBox Content="چک باکس"></CheckBox>
    </ComboBox.Items>
</ComboBox>

فقط استاد ، اینجا اگه بخوایم نوع داده ای را مشخص کنیم ، باید فضای نام و نام کلاس را با عملگر : از هم جدا کنیم؟
اگه عملگر نقطه بذاریم ، اون را به عنوان پروپتی میشناسه؟
مثلا اگه در System:Int32 ، بجش بنویسیم System.Int32 ، اون وقت این طور تفسیر میکنه که Int32 ، باید عضوی از تگ (شی) System بوده باشه و System را هم قبلا باید به عنوان تگِ پدریا پدربزرگِ System.Int32 ، تعریف شده باشه . این طور که گفتم ، تفسیر میکنه؟
بعد اینکه چرا برای تگ window ، فضای نام را ننوشت؟

یا مثلا :

کد:
<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <!-- no explicit new GradientStopCollection, parser knows how to find or create -->
    <GradientStop Offset="0.0" Color="Red" />
    <GradientStop Offset="1.0" Color="Blue" />
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>
 
آخرین ویرایش:

the_king

مدیرکل انجمن
استاد ، خوب اینی که گفتم ، درسته دیگه .
اینجا بهش اشاره کرد :

XAML overview - WPF
دو تا مساله متفاوت ئه، شما پرسیدید Attribute های XML شبیه پروپرتی های #C هستند که نیست و گفتم نیستن، در اون لینک نوشته که اغلب شخصه های اشیاء بصورت صفت المنت ها مشخص میشن.
نه اینکه صفت مثل مشخصه باشه، مشخصه مقدارش رو توسط صفت دریافت می کنه. همونطور که اغلب دستگاه های بارکد خوان داده ورودی شون رو می توانند از طریق بافر صفحه کلید ارسال کنند، نه اینکه دستگاه بارکد خوان شبیه صفحه کلید باشه.
خود مشخصه Content رو در کنترل های WPF ببینید. Content برای مشخص کردن مقدارش به دو حالت هم از attribute میتونه استفاده کنه و هم از فضای Content میان تگ شروع و پایان.
اما باز این به این معنی نیست که content میان تگ شروع و پایان مشابه پروپرتی های #C ئه. تگ هایی در اون content نوشته میشه که با ورودی پروپرتی ها جور در نمیاد.
یا نمونه مثال های Storyboards و صفت Storyboard.TargetName رو ببینید. Storyboard.TargetName یک مشخصه الحاقی است، جزو قابلیت های WPF ئه ولی در #C نیست.
 

the_king

مدیرکل انجمن
استاد ، از این دست کدها که مفسر اون را خلاصه میکنه و الان به یادتون میاد را میتونین کلا بهم بگین؟
چون خیلی از این دست کدها (ی کامل) به یادگیری ام کمک میکنه (مثل قضیه ی this در کدهای سی شارپ که معمولا نمیذاره و ...) . وگرنه توی ذهنم صرفا حفظ میکنم که باعث میشه زود اون مطلب را فراموش کنم .
خیلی ممنون .
از اون مواردی نیست که وقت گذاشتن روش فایده خاصی داشته باشه، صرفا ویرایش ظاهریه. از Resharper استفاده کنید، برای XML و XAML توصیه های مفیدی میکنه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیر. دلیلش هم که میدونید. قبلا چند بار توضیح دادم که حکم هایی که از روی مثال ها اختراع می کنید به چه دلیلی اشتباه هستند. شرح استدلال استقرایی رو بخونید.

خیلی ممنون استاد .
بله درست گفتید .
الان مثلا وقتی به Border ، محتوا (content در xml) در بین تگ ها میدیم ، برابر با اینه که پروپرتیِ Child اش را مقداردهی کرده باشیم .
یعنی کد زیر :

کد:
<Border>
  <TextBox Width="300"/>
</Border>

با کد زیر برابر هه :

کد:
<Border>
  <Border.Child>
    <TextBox Width="300"/>
  </Border.Child>
</Border>

الان این resharper که گفتید را نصب کنم ، راهنمایی مون میکنه که کد کامل را بنویسیم؟ یا خودش کد کامل را مینویسه؟
به این قضیه که پروپرتی را نمینویسن و یهو محتوا را مقدار میدن ، content property میگن؟
 

the_king

مدیرکل انجمن
الان این resharper که گفتید را نصب کنم ، راهنمایی مون میکنه که کد کامل را بنویسیم؟ یا خودش کد کامل را مینویسه؟
کد کامل و غیر کامل نداره، داره یک چیزی رو توصیف می کنه، مهم توصیف کردنه، نه اینور و اونور شدنش. صرفا تفاوت ظاهریه، در مستندات هم صحبت این نمیشه که اینجوری کامل ئه، اونجوری کامل نیست.
HTML:
<Button Content="test" />
<Button Content="test" ></Button>
<Button>test</Button>
<Button><Button.Content>test</Button.Content></Button>
یک استفاده پیشفرضی برای content تگ در نظر گرفته اند، فرضا برای مشخصه Content که حالا می توانید ازش استفاده کنید یا نه.
Resharper یک ابزار جدی برنامه نویسی است، روی مواردی مانور میده که انجامش موثر باشه. تنظیمات خیلی زیادی داره، هم برای انتخاب سبک نگارش مورد علاقه و هم توصیه ها.

به این قضیه که پروپرتی را نمینویسن و یهو محتوا را مقدار میدن ، content property میگن؟
اگر اسمی هم داشته باشه اطلاعی ازش ندارم، ولی content property یعنی مشخصه content، با کاری که توصیفش میکنید جور در نمیاد.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
ما object element داریم که به المنت ها و تگ هایی میگن که از نوع آبجکت (معمولا از نوع کنترل ها) هستند و property element داریم که به تگ ها و المنت هایی که میخوان پروپرتی ای از یه آبجکت یا یک کنترل را مثل کد زیر مقداردهی کنن ، میگن :

کد:
<ComboBox Margin="10,47,0,0">
    <ComboBox.Items>
        <System:Int32>10</System:Int32>
        <System:Int32>20</System:Int32>
        <System:String>سلام</System:String>
    </ComboBox.Items>
</ComboBox>

در کد بالا ، به تگ اول (ComboBox) ، میگن object element و به تگ دوم (ComboBox.Items) که یه پروپرتی از یه کنترل و آبجکت هست را property element میگن .
درسته؟

بعد اینکه در wpf ، یه کلاس کنترل داریم که خودش از FrameworkElement ارث بری میکنه .
خیلی از کنترل هایی مثل Page و Panel و اینها ، فرزند کلاس Control نیستند و فرزند FrameworkElement هستند . اصلا با این اوضاعی که کلاس هایی مثل همین Page و Panel ، وقتی فرزند Control نیستند ، به اینها دیگه کنترل نمیگن . درسته دیگه؟ بهشون FrameworkElement میگن؟
میخواستم دقیق تر فرق این کلاس FrameworkElement و کلاس Control در wpf را بدونم . چرا مثل windows form ، همه ی اینها فرزند Control نشدند؟

--------------------------------------------------------

استاد ، من بخش Markup extensions اش گیر کردم .
الان در کد زیر :

کد:
<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</Page.Resources>

را من میخوام بصورت کامل ترین شکل ممکن بنویسم :
1) اولا پروپرتیِ FrameworkElement.Resources ، شی ای از کلاس کالکشن دیکشنری ResourceDictionary را برمیگردونه که یک hash table میتونه باشه (کلا یه کالکشن) .
این کلاس ResourceDictionary هم برای اضافه کردن اعضا (مثل hash table) ، مقدار Key و Value را در سی شارپ میخواد . بنابراین باید همین مقادیر ، برای پروپرتی های Key و Value را در xml هم بهشون بدیم .
و همچنین از اونجا که در همون لینک گفته بود که فقط اعضای کالکشن ها و آرایه ها را باید به عنوان یه عضوی که آرایه یا کالکشن لازم داره ، باید به اون عضو بدیم :

XAML overview - WPF

پس کد بالا در سی شارپ را اگه بخوایم بنویسیم ، چجوری باید بنویسیم؟
آیا مثلا SolidColorBrush ای که در کد بالا نوشت ، برابر با این هست که مثلا یه شی به عضو کلاس ResourceDictionary اضافه کرده باشیم که مقدار key اش رشته ی MyBrush هست و مقدار value اش شی ای از SolidColorBrush هست که مقدار پروپرتی Color از این شی ، Gold هست؟
یعنی آیا این جوری هست؟ :

کد:
            this.btnTest1.Resources = new ResourceDictionary();
            SolidColorBrush solidColorBrush = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("Gold"));
            this.btnTest1.Resources.Add("MyBrush", solidColorBrush);

در خط بعدی (در کد اول) که Style هست هم به همین صورت هست؟ یعنی Style را به عنوان عضو دوم از کالکشن ResourceDictionary در بالا میشه حساب کرد؟
اگه این طور نیست و کد سی شارپ ای که دادم ، برابر با کد xml ای که دادم نیست ، پس بی زحمت ، معادل کدِ سی شارپِ اون کدِ xml ای که دادم را مینویسین؟

2) درباره ی همین پروپرتی FrameworkElement.Resources ، زیاد نمیدونم . آیا فقط کاربردش برای نوشتن style هاست؟ یا کاربرد دیگه ای هم داره؟
خیلی ممنون استاد .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
ما object element داریم که به المنت ها و تگ هایی میگن که از نوع آبجکت (معمولا از نوع کنترل ها) هستند و property element داریم که به تگ ها و المنت هایی که میخوان پروپرتی ای از یه آبجکت یا یک کنترل را مثل کد زیر مقداردهی کنن ، میگن :

کد:
<ComboBox Margin="10,47,0,0">
    <ComboBox.Items>
        <System:Int32>10</System:Int32>
        <System:Int32>20</System:Int32>
        <System:String>سلام</System:String>
    </ComboBox.Items>
</ComboBox>

در کد بالا ، به تگ اول (ComboBox) ، میگن object element و به تگ دوم (ComboBox.Items) که یه پروپرتی از یه کنترل و آبجکت هست را property element میگن .
درسته؟
بله.
بعد اینکه در wpf ، یه کلاس کنترل داریم که خودش از FrameworkElement ارث بری میکنه .
خیلی از کنترل هایی مثل Page و Panel و اینها ، فرزند کلاس Control نیستند و فرزند FrameworkElement هستند . اصلا با این اوضاعی که کلاس هایی مثل همین Page و Panel ، وقتی فرزند Control نیستند ، به اینها دیگه کنترل نمیگن . درسته دیگه؟ بهشون FrameworkElement میگن؟
جواب بستگی به این داره که کنترل رو چی تعریف بکنید، اگر کنترل رو بر حسب وراثت از کلاس در نظر بگیرید خوب طبعا هر کلاسی که وارث Control نباشه کنترل نیست، اما اگر کنترل رو از دید عملکرد و ظاهر مد نظر دارید ممکنه مواردی کنترل باشند ولی وارث Control نباشند. همانطور که از دید ظاهری و عملکرد در فرم های ویندوز ToolBarButton یک دکمه است و کنترل ئه و خود مایکروسافت در توصیف اش چند جا میگه control ولی از نظر وراثت مثل Timer و BackgroundWorker صرفا کمپوننت ئه و وارث Control نیست. ToolBarButton Class
اگه بگید Panel کنترل نیست یا بگید کنترل نیست، در هر صورت از یک دیدگاه حرفتون درسته. شرح مشخصه DefaultStyleKey رو بخونید، نوشته for this control یعنی Panel رو control به حساب میاره :
Gets or sets the key to use to reference the style for this control, when theme styles are used or defined.
Panel Class

میخواستم دقیق تر فرق این کلاس FrameworkElement و کلاس Control در wpf را بدونم . چرا مثل windows form ، همه ی اینها فرزند Control نشدند؟
تفاوت بین Conrtrol و موارد متفاوتی مثل Shape ها رو ببینید، اگر قرار بود Shape وارث Control باشه باید هر خصوصیت بی ربط Control رو بیخودی نگه میداشت. بالاخره در یک جایی که خصوصیات خیلی متفاوت هستند با وراثت تفکیک صورت بگیره. همونطور که نباید در Windows Forms همه Component ها الزاما وارث Control میشدند.

استاد ، من بخش Markup extensions اش گیر کردم .
الان در کد زیر :

کد:
<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</Page.Resources>

را من میخوام بصورت کامل ترین شکل ممکن بنویسم.
همینجا توقف کنید. دارید برای خودتون یک تعریفی از یک مورد موهومی میسازید که کسی جز خودتون فایده ای در اون نمی بینه.
چرا میخواهید کاری بکنید که از اساس بی فایده است؟ تازه شکل کامل اصلا معنی نداره که دنبال کاملترین اش باشید.
حرف تون مثل اینه که من بگم میخوام به سبک زوج کد نویسی کنم، سبک من در آوردی که همه چی زوج باشه، هر چی عدد در کد هست، طول هر سطر، تعداد سطر ها، تعداد کلاس ها و ... فرد نباشه، همه شون زوج باشه.
کاملترین شکل ممکن، به انگلیسی the most complete representation رو کجا دیدید؟ دیدید در WPF تعریفی به این نام باشه؟
عبارت wpf the most complete representation رو در سایت مایکروسافت جستجو کنید، ببینید اصلا همچین تعریفی از complete representation در کد XML بوده که حالا بخواهید به اون مدل کد بنویسید؟
بالاخره هر تلاشی می کنید باید نتیجه اش یک امتیازی، ارزشی، فایده ای داشته باشه که بگیم فلان کار رو می کنم چون امتیازش، فایده اش، تاثیرش بهمان ئه.
وقتی برای بوجود آوردن یک حالتی تلاش می کنید که تا حالا تعریف نشده بوده و امتیازی هم محسوب نمیشه فقط وقت تون رو تلف می کنید.
مزیتی هم نداره که بگیم یک سبک جدید در کد نویسی محسوب میشه.

2) درباره ی همین پروپرتی FrameworkElement.Resources ، زیاد نمیدونم . آیا فقط کاربردش برای نوشتن style هاست؟ یا کاربرد دیگه ای هم داره؟
نه. از نظر فنی میتونه هر چیزی باشه. دلیل اینکه بیشتر برای Style بکار میره تکرر استفاده از Style مشابه در جاهای مختلف ئه. مناسب ئه برای اینکه چیزی یکبار تعریف بشه و چند بار استفاده بشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بله.

جواب بستگی به این داره که کنترل رو چی تعریف بکنید، اگر کنترل رو بر حسب وراثت از کلاس در نظر بگیرید خوب طبعا هر کلاسی که وارث Control نباشه کنترل نیست، اما اگر کنترل رو از دید عملکرد و ظاهر مد نظر دارید ممکنه مواردی کنترل باشند ولی وارث Control نباشند. همانطور که از دید ظاهری و عملکرد در فرم های ویندوز ToolBarButton یک دکمه است و کنترل ئه و خود مایکروسافت در توصیف اش چند جا میگه control ولی از نظر وراثت مثل Timer و BackgroundWorker صرفا کمپوننت ئه و وارث Control نیست. ToolBarButton Class
اگه بگید Panel کنترل نیست یا بگید کنترل نیست، در هر صورت از یک دیدگاه حرفتون درسته. شرح مشخصه DefaultStyleKey رو بخونید، نوشته for this control یعنی Panel رو control به حساب میاره :

Panel Class


تفاوت بین Conrtrol و موارد متفاوتی مثل Shape ها رو ببینید، اگر قرار بود Shape وارث Control باشه باید هر خصوصیت بی ربط Control رو بیخودی نگه میداشت. بالاخره در یک جایی که خصوصیات خیلی متفاوت هستند با وراثت تفکیک صورت بگیره. همونطور که نباید در Windows Forms همه Component ها الزاما وارث Control میشدند.


نه. از نظر فنی میتونه هر چیزی باشه. دلیل اینکه بیشتر برای Style بکار میره تکرر استفاده از Style مشابه در جاهای مختلف ئه. مناسب ئه برای اینکه چیزی یکبار تعریف بشه و چند بار استفاده بشه.

خیلی ممنون استاد .

همینجا توقف کنید. دارید برای خودتون یک تعریفی از یک مورد موهومی میسازید که کسی جز خودتون فایده ای در اون نمی بینه.
چرا میخواهید کاری بکنید که از اساس بی فایده است؟ تازه شکل کامل اصلا معنی نداره که دنبال کاملترین اش باشید.
حرف تون مثل اینه که من بگم میخوام به سبک زوج کد نویسی کنم، سبک من در آوردی که همه چی زوج باشه، هر چی عدد در کد هست، طول هر سطر، تعداد سطر ها، تعداد کلاس ها و ... فرد نباشه، همه شون زوج باشه.
کاملترین شکل ممکن، به انگلیسی the most complete representation رو کجا دیدید؟ دیدید در WPF تعریفی به این نام باشه؟
عبارت wpf the most complete representation رو در سایت مایکروسافت جستجو کنید، ببینید اصلا همچین تعریفی از complete representation در کد XML بوده که حالا بخواهید به اون مدل کد بنویسید؟
بالاخره هر تلاشی می کنید باید نتیجه اش یک امتیازی، ارزشی، فایده ای داشته باشه که بگیم فلان کار رو می کنم چون امتیازش، فایده اش، تاثیرش بهمان ئه.
وقتی برای بوجود آوردن یک حالتی تلاش می کنید که تا حالا تعریف نشده بوده و امتیازی هم محسوب نمیشه فقط وقت تون رو تلف می کنید.
مزیتی هم نداره که بگیم یک سبک جدید در کد نویسی محسوب میشه.

استاد ، مهم ترین بخش سئوالم همین بود .
اون جمله ی " من میخوام بصورت کامل ترین شکل ممکن بنویسم." که گفتم را کلا نادیده بگیرید . منظورم را بد متوجه شدید .
سئوالم این بود که اون کد xml ای که دادم ، برابر هست با همون کد سی شارپ که دادم؟
اگه نیست ، کد سی شارپِ مربوط به کد اون xml ، چی میشه؟
لطفا دوباره اون بخش (سئوال 1) را جواب میدین؟
خیلی ممنون
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f

خیلی ممنون استاد .
پس الان برای همون کد xml (کد زیر) :

کد:
<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</Page.Resources>

کد کامل سی شارپ اش آیا کد زیر میشه؟

کد:
            SolidColorBrush solidColorBrush = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("Gold"));
            Setter setter = new Setter(DependencyProperty.Register("Background",typeof(Brush), typeof(Border)), (System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("Blue"), "Border");
         
            this.myPage1.Resources = new ResourceDictionary();
            this.myPage1.Resources.Add("MyBrush", solidColorBrush);
            this.myPage1.Resources.Add("PageBackground", setter);

نمیدونم متد DependencyProperty.Register در کد بالا را درست دادم؟ مخصوصا آرگومان سومش که مقدار typeof(Border) دادم ، درسته؟
اگه کد سی شارپ بالا درست نیست ، تصحیح اش میکنین؟


پس در کد xml بالا ، بخاطر این مقدار x:Key را تعیین کرد که مفسر xml در wpf ، این مقدار را برای ResourceDictionary.Keys اش در نظر میگیره (چون در دیکشنری ها ، مقدار Keys باید مشخص بشه) . همچنین در این کد xml ، مفسر xml در wpf ، تگ و المنت هایی که درون تگ Page.Resources نوشته میشه (مثل تگ SolidColorBrush و Style) ، هر کدوم از این تگ ها را به عنوان یک عضو از ResourceDictionary.Values در نظر میگیره .
درسته؟


اما من دقیق هنوز اون پیشوند x: که قبل از Key گذاشته میشه را متوجه نشدم .
الان اون پیشوند x ، همون پیشوند فضای نام هست دیگه؟
خوب ، پس چرا اون پیشوند را برای قسمت های دیگه ننوشتند . مثلا برای تگ Style یا برای TargetType نذاشتن؟ مثلا چرا تگ Style را به این شکل ننوشتن و فقط برای اتریباتسِ Key ، اون پیشوند را گذاشتن ؟ :

کد:
<x:Style x:TargetType="Border" x:Key="PageBackground">

و همچنین برای بقیه ی تگ ها و المنت ها چرا همین جوری ننوشتند؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون استاد .
پس الان برای همون کد xml (کد زیر) :

کد:
<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</Page.Resources>

کد کامل سی شارپ اش آیا کد زیر میشه؟
من وقتی میتونم جواب سوالی رو بدونم که صورت سوال رو متوجه بشم، غیر از اینه؟ من نمیدونم کد کامل سی شارپ یعنی چی.
جایی تا حالا در مورد همچین چیزی نخوندم، کسی هم یادم نداده. کجا دنبالش بگردم تا کد کامل سی شارپ نوشتن رو یاد بگیرم و بفهمم کد کامل سی شارپ چیه که بعدش بتونم جواب سوال شما رو بدم؟

نمیدونم متد DependencyProperty.Register در کد بالا را درست دادم؟ مخصوصا آرگومان سومش که مقدار typeof(Border) دادم ، درسته؟
اگه کد سی شارپ بالا درست نیست ، تصحیح اش میکنین؟
در Resources دو تا مدخل، آیتم، عضو یا هر چیزی که اسمش رو بذارید ثبت شده، که کلید شون MyBrush و PageBackground ئه. نوع شون هم SolidColorBrush و Style ئه.
اون Setter جزو مدخل های Resources که نیست، جزئی از Style ئه. شما در کد #C تون اصلا Style نساختید. PageBackground قرار بود Style باشه، نه Setter
در ضمن Background جزو مشخصه های موجود در Border هست. شما با DependencyProperty.Register چیزی رو ثبت می کنید که قبلا نبوده و جدید ئه. Background رو که نمیشه از نو ثبت کرد.
باید سراغ اون DependencyProperty بروید که قبلا برای Background ثبت شده. BackgroundProperty که دنبالش هستید یک فیلد static readonly ئه، با Border.BackgroundProperty بهش دسترسی دارید.
Brushes.Blue هم که مورد مشخصی است.

پس در کد xml بالا ، بخاطر این مقدار x:Key را تعیین کرد که مفسر xml در wpf ، این مقدار را برای ResourceDictionary.Keys اش در نظر میگیره (چون در دیکشنری ها ، مقدار Keys باید مشخص بشه) . همچنین در این کد xml ، مفسر xml در wpf ، تگ و المنت هایی که درون تگ Page.Resources نوشته میشه (مثل تگ SolidColorBrush و Style) ، هر کدوم از این تگ ها را به عنوان یک عضو از ResourceDictionary.Values در نظر میگیره .
درسته؟
بله.

الان اون پیشوند x ، همون پیشوند فضای نام هست دیگه؟
بله.

خوب ، پس چرا اون پیشوند را برای قسمت های دیگه ننوشتند . مثلا برای تگ Style یا برای TargetType نذاشتن؟ مثلا چرا تگ Style را به این شکل ننوشتن و فقط برای اتریباتسِ Key ، اون پیشوند را گذاشتن ؟ :
کد:
<x:Style x:TargetType="Border" x:Key="PageBackground">

و همچنین برای بقیه ی تگ ها و المنت ها چرا همین جوری ننوشتند؟
به مفهوم Key دقت کنید. شما یک Style میسازید، مثلا با کلید PageBackground هم درج اش می کنید. این Key متعلق به Style که نیست. برای Style ها Key معنی نداره، Style.Key نداریم. همچین مشخصه ای نداره، همچین فیلدی نداره، کاربرد Style ارتباطی با Key نداره. اون Key از دیکشنری ئه میاد، ما صفت Key رو برای خود شی Style که مقدار دهی نمی کنیم، برای اون مدخل ثبت می کنیم که این Style رو میخواد به عنوان مقدار بگیره. Key یک سمت ئه و Value یک سمت دیگه مدخل. Style ئه Value بوده، x:Key رو داریم در Value می نویسیم، اگر پیشوند نداشت میشد جزو خود Value که برای Style هم کاربرد و معنی نداره.
برای همین attribute ئه x:Key شده. با attribute ای مثل TargetType فرق داره چون TargetType جزئی از Style ئه، Style.TargetType هست و معنی داره. جزئی از خود Value ئه.
اینجور جاها اون پیشوند مشخص میکنه که این attribute ئه Key که برای خود تگ کاربردی نداره و معلوم نیست از کجا سر و کله اش پیدا شده، برای چه منظوریه و به چی ربط داره.
 

جدیدترین ارسال ها

بالا