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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بازم ممنون
میگم من چرا کدهامو توی فایل MainWindow.g.i.cs و توی تابع InitializeComponent مینویسم ، اجرا نمیشه اصلا؟
کد :

کد:
private Button button;

در کلاس MainWindow و کد :

کد:
this.button = new Button();
            this.button.Content = "Test";
            this.button.Margin = new Thickness(10, 10, 800, 500);
            this.grid.Children.Add(this.button);

هم رو در تابع InitializeComponent مینویسم
اصلا اجرا نمیشه . چرا؟
ولی داخل این فایل وقتی ننویسم (مثلا توی متد سازنده ی MainWindow بنویسم) ، اجرا میشه و شی ساخته میشه
------------------------------------
بعد اینکه بجز قضیه ی بالا ، وقتی کد :
کد:
this.button.Margin = new Thickness(10, 10, 800, 500);
را مینویسم ، در حالت عادی مشکلی نداره ولی وقتی ریزولیشن پروژه را کوچیک و بزرگ میکنم ، نسبت این دکمه ، به همون اندازه ی اولیه نمیمونه یعنی مثلا در حالت عادی و در ریزولیشن 800 در 600 ، اگه اون دکمه اندازه ی 100 در 50 را داشته باشه ، وقتی پروژه را بزرگ میکنم (مثلا ابعاد 1900 در 1000) ، اون دکمه خیلی بزرگتر از نسبت قبلی خودش میشه مثلا اندازه ی دکمه 600 در 400 میشه !
یعنی همون نسبت اش نگه داشته نمیشه .
برای ثابت نگه داشتن نسبت در هر اندازه ای ، باید چی کار کرد؟
-------------------------------------
بعد هم اینکه من کد زیر را مینویسم :
کد:
            System.Windows.Forms.Button winFrmButton1 = new System.Windows.Forms.Button();
            winFrmButton1.Bounds = new System.Drawing.Rectangle(10, 10, 80, 35);
            //winFrmButton1.Margin = new System.Windows.Forms.Padding(200, 200, 200, 200);
            winFrmButton1.Text = "winFrmButton 1";
            winFrmButton1.BackColor = System.Drawing.Color.SlateGray;

            WindowsFormsHost winFrmHost1 = new WindowsFormsHost();
            winFrmHost1.Margin = new Thickness(100, 100, 100, 100);
            winFrmHost1.Child = winFrmButton1;
           
            this.grid.Children.Add(winFrmHost1);
ولی اندازه ی دکمه (System.Windows.Forms.Button) اون چیزی درنمیاد که من میخوام .کلا چه با Bounds و چه با Margin اندازه ی این دکمه را مشخص کنم ، باز هم اندازه ی دکمه ، به اندازه ی کل شی WindowsFormsHost ام میشه . چیکار باید کرد؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
بازم ممنون
میگم من چرا کدهامو توی فایل MainWindow.g.i.cs و توی تابع InitializeComponent مینویسم ، اجرا نمیشه اصلا؟
کد :

کد:
private Button button;

در کلاس MainWindow و کد :

کد:
this.button = new Button();
            this.button.Content = "Test";
            this.button.Margin = new Thickness(10, 10, 800, 500);
            this.grid.Children.Add(this.button);

هم رو در تابع InitializeComponent مینویسم
اصلا اجرا نمیشه . چرا؟
ولی داخل این فایل وقتی ننویسم (مثلا توی متد سازنده ی MainWindow بنویسم) ، اجرا میشه و شی ساخته میشه

مربوط به روال Designer ئه WPF هستش که قراره خودش کد رو بصورت خودکار تولید کنه و بر اساس اطلاعات داخل Resource اشیاء رو تعریف کنه، نه اینکه شما در روال کد نویسی اش دست ببرید. کدی که می نویسید ماندگار نیست، حذف میشه.
بعد اینکه بجز قضیه ی بالا ، وقتی کد :
کد:
this.button.Margin = new Thickness(10, 10, 800, 500);
را مینویسم ، در حالت عادی مشکلی نداره ولی وقتی ریزولیشن پروژه را کوچیک و بزرگ میکنم ، نسبت این دکمه ، به همون اندازه ی اولیه نمیمونه یعنی مثلا در حالت عادی و در ریزولیشن 800 در 600 ، اگه اون دکمه اندازه ی 100 در 50 را داشته باشه ، وقتی پروژه را بزرگ میکنم (مثلا ابعاد 1900 در 1000) ، اون دکمه خیلی بزرگتر از نسبت قبلی خودش میشه مثلا اندازه ی دکمه 600 در 400 میشه !
یعنی همون نسبت اش نگه داشته نمیشه .
برای ثابت نگه داشتن نسبت در هر اندازه ای ، باید چی کار کرد؟
اولین کاری که باید بکنید اینه که توی گوگل جستجو کنید ببینید برای مشکل تون چه راه حل هایی وجود داره. برای یک سوال خیلی ابتدایی که پاسخ ساده ای داره نیازی به مطرح کردن سوال در فروم نیست.
Alignment افقی و عمودی داره، مثل Anchor در کنترل های WinForms میمونه. می توانید بگید مثلا به Left و Top باشه که بر اساس ابعاد Parent اش تغییر ابعاد نده.

بعد هم اینکه من کد زیر را مینویسم :
کد:
            System.Windows.Forms.Button winFrmButton1 = new System.Windows.Forms.Button();
            winFrmButton1.Bounds = new System.Drawing.Rectangle(10, 10, 80, 35);
            //winFrmButton1.Margin = new System.Windows.Forms.Padding(200, 200, 200, 200);
            winFrmButton1.Text = "winFrmButton 1";
            winFrmButton1.BackColor = System.Drawing.Color.SlateGray;

            WindowsFormsHost winFrmHost1 = new WindowsFormsHost();
            winFrmHost1.Margin = new Thickness(100, 100, 100, 100);
            winFrmHost1.Child = winFrmButton1;
          
            this.grid.Children.Add(winFrmHost1);
ولی اندازه ی دکمه (System.Windows.Forms.Button) اون چیزی درنمیاد که من میخوام .کلا چه با Bounds و چه با Margin اندازه ی این دکمه را مشخص کنم ، باز هم اندازه ی دکمه ، به اندازه ی کل شی WindowsFormsHost ام میشه . چیکار باید کرد؟
خیلی طبیعیه، هر کنترلی رو بر اساس معماری پلتفرم خودش باید تعیین کنید. شما ابعاد WindowsFormsHost رو باید تعیین کنید، کاری به ابعاد و حاشیه محتوای داخلش نداشته باشید.
 

SajjadKhati

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

ممنون
آها هر کنترل را باید فقط توی یک کنترلِ WindowsFormsHost بذارم و ابعاد WindowsFormsHost رو فقط تنظیم کنم؟
یعنی ابعاد هر کنترلی که توی WindowsFormsHost بذارم ، به اندازه ی کلِ ابعادِ WindowsFormsHost میشه؟
منظورتون اینه؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون
آها هر کنترل را باید فقط توی یک کنترلِ WindowsFormsHost بذارم و ابعاد WindowsFormsHost رو فقط تنظیم کنم؟
یعنی ابعاد هر کنترلی که توی WindowsFormsHost بذارم ، به اندازه ی کلِ ابعادِ WindowsFormsHost میشه؟
منظورتون اینه؟
بله. این کاریه که طراح اون WindowsFormsHost انجام داده، چون اگر غیر از این بود بعدا دشواری مدیریت ابعاد کنترل داخلش مشکلات رو بیشتر می کرد.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد علی ، روندِ کلیِ نصب در wpf چجوری هه؟
مثلا من شی GeometryDrawing رو توی شی DrawingGroup ریختم ، حالا شی DrawingGroup رو چجوری توی کنترلی مثل کنترل gride اضافه کنم؟
یا مثلا اگه یه تصویر (معادل bitmap در winform) رو بخوام اضافه کنم چی؟
و یه توضیح کلی درباره ترسیمات 2 بعدی در wpf میدین؟ مثلا در winform همه ی توابع ترسیمات در کلاس graphic بود . ولی اینجا انگار هر شکل ، یه کلاس مخصوص خودش رو داره .
 

the_king

مدیرکل انجمن
سلام
استاد علی ، روندِ کلیِ نصب در wpf چجوری هه؟
مثلا من شی GeometryDrawing رو توی شی DrawingGroup ریختم ، حالا شی DrawingGroup رو چجوری توی کنترلی مثل کنترل gride اضافه کنم؟
نصب؟ شما به grid اضافه اش نمی کنید چون کنترل نیست، اما فرضا میایید روال رسم زمینه grid رو بر اساس اون DrawingGroup انجام می دهید :
کد:
grid1.Background = new DrawingBrush(d);
یا مثلا اگه یه تصویر (معادل bitmap در winform) رو بخوام اضافه کنم چی؟
مشکل تون با گوگل چیه که قبل از پرسش جستجو نمی کنید؟
کد:
grid1.Background = new ImageBrush(new BitmapImage(new Uri(@"C:\file.jpg")));
و یه توضیح کلی درباره ترسیمات 2 بعدی در wpf میدین؟ مثلا در winform همه ی توابع ترسیمات در کلاس graphic بود . ولی اینجا انگار هر شکل ، یه کلاس مخصوص خودش رو داره .
اشتباهی دارید مقایسه می کنید، شما شیوه رسم در DC ئه WinForms رو مقایسه می کنید با روال اضافه کردن اشیاء در WPF. اضافه کردن اون کلاس ها مربوط به رسم در DrawingVisual ئه WPF نیست. دو تا مورد نامربوط رو دارید با هم مقایسه می کنید. معادل چیزی که می خواهید هست ولی این چیزی که دارید باهاش آشنا میشید یک مورد متفاوت دیگه است.
کلاس هایی که میگید شیوه های متفاوتی رو برای رسم بکار می برند. بعضی هاشون مثل Ellipse ها Shape و Element هستند، اینها خودشون روال رسم دارند، مستقل هستند و خودشون نمایش خودشون رو انجام می دهند، مثل کنترل ها. اما یکسری دیگه Geometry هم هستند مثل EllipseGeometry که صرفا تعریف کننده هستند، خودشون تو رسم هیچ دخالتی ندارند، براشون GeometryDrawing لازمه تا رسم بشوند.
با این وجود این رسم ها که بر اساس تعریف شیء ئه ارتباطی با اون رسم در Graphic نداره. معادل اون رسم در Graphic رسم در DrawingVisual ئه. یک DrawingVisual میسازید و RenderOpen اش می کنید تا آماده رسم بشه و در اون DrawingContext باز شده انواع روال های رسم مشابه Graphics هست. رسم که تموم شد Close اش می کنید تا بسته بشه و بعد داخل هر RenderTargetBitmap ای که بسازید امکان Render کردن اون DrawingVisual ئه هست.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد . :rose:
استاد ، سئوالات xml را هم میتونم توی همین تاپیک بپرسم؟ (تا پست بعدی تون که جواب رو بگیرم ، فعلا توی همینجا میپرسم)

استاد ، چند تا سئوال داشتم :
1) الان تگ ها ، همون element ها در xml هستند؟
2) بعد اینکه کد زیر :

کد:
<window>
title = "New Window"
</window>

با کد زیر ، برابر هه دیگه . درسته؟ :

کد:
<window title = "New Window">

</window>

در دو کد بالا ، هیچ فرقی با هم ندارن . درسته؟ یعنی هر دو یک کد و یک نتیجه را دارند اما نوشتن شون متفاوت هه . درسته؟
به title در هر دو کد بالا ، attributes میگن . درسته؟

3) کدهای شماره ی 2 را به شکل زیر نمیشه نوشت . درسته؟ :
کد:
<window  "New Window">

</window>

خیلی ممنون استاد :rose:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شما هم که هر کاری می کنید بنظرتون سخته. با یک سیستم وکتوری مثل فلش کار نکردید، ابعاد و نسبت طول به عرض ثابت نمیمونه. باید قابل تغییر باشه. چیزی رو طراحی می کنید که معلوم نیست در چه ابعادی نمایش داده میشه. بجز برای موارد خاص قرار نیست طول و عرض و موقعیت ثابت بهش بدید. Margin فلسفه داره. ابعاد از قبل مشخص نیست، ممکنه بزرگ و کوچیک بشه، پس بجای تعیین یک موقعیت و ابعاد مشخص، تعیین می کنید که از گوشه و کنار Content ئه چقدر فاصله بگیره، همین. که وقتی سایز Content ئه عوض میشه با همون شرایط خودکار تغییر ابعاد بده. Width و Height رو که تعیین می کنید یعنی دیگه این فلسفه رو گذاشتین کنار.

استاد ، طبق توضیحات تون ، پس پروپرتیِ Margin ، نباید شی Thikness ای که بهش عدد میدیم ، این اعداد ، بر حسب پیکسل باشند .
پس باید بر حسب درصد یا چیزی شبیه به تین باشند .
درسته؟
اگه مثلا بر حسب پیکسل باشند و ما وقتی ۵۰ بدیم ، توی هر ریزوایشن ای که کنترل (یا در ووقع به کنترل در wpf ، المنت میگن . درسته؟) یا المنت parent مون تغییر کنه ، باز در هر ریزولیشن ای ، همون ۵۰ پیکسل فاصله خواهد داشت و فاصله و اندازه اش تغییری نمیکنه.
درسته؟

توی توضیحات پروپرتی Margin انگار نوشته که این مقدارش ، نسبت به المنت (کنترل) والد یا کنترل های خواهر و برادرش قیاس و اِعمال میشه. البته اگه من درست متوجه شده باشم.
حالا اگه درسته ، چجوری میشه که مقدار Margin یک کنترل ، نسبت به دو کنترل قیاس میشه؟!
بعد هم میگفت که این مقدار ، در المنت های خواهر و برادر ، افزوده شدنی هستن . مثلا وقتی دو المنت و کنترلِ خواهر و برادر را ۳۰ بدیم ، ۶۰ واحد (حالا نمیدونم منظورش پیکسل هست یا نه) از هم فاصله میگیرند .
چرا این طوره و این اضافه شدن ، قضیه اش چیه؟
 

the_king

مدیرکل انجمن
خیلی ممنون استاد . :rose:
استاد ، سئوالات xml را هم میتونم توی همین تاپیک بپرسم؟ (تا پست بعدی تون که جواب رو بگیرم ، فعلا توی همینجا میپرسم)

استاد ، چند تا سئوال داشتم :
1) الان تگ ها ، همون element ها در xml هستند؟
element دقیقا یک Tag نیست ولی میتونه بر اساس تگ تشکیل بشه، مثلا یک تگ div با یکسری زیر مجموعه که خودشون تگ هستند یکجا یک element حساب میشه. از تگ شروع div تا تگ div پایانش یک element به حساب میاد. این element خودش شامل چندین element داخلی ئه.
2) بعد اینکه کد زیر :

کد:
<window>
title = "New Window"
</window>

با کد زیر ، برابر هه دیگه . درسته؟ :

کد:
<window title = "New Window">

</window>
[/QUOTE]
نه برابر نیست. دومی attribute ئه، اولی بصورت attribute تفسیر نمیشه. در اولی شما یک content نوشته اید بصورت "title = "New Window که از اول تا آخرش فقط یک متن ئه، قاعده نگارش attribute رو هم داخلش رعایت بکنید همچنان یک متن ئه، ظاهر attribute داره ولی فقط ظاهر ئ نیست. content به اجزاء خاصی تفکیک و تفسیر نمیشه. content جای نوشتن attribute نیست. attribute باید داخل خود تگ window نوشته بشه، نه بین تگ شروع و پایان، بین تگ شروع و پایان برای content ئه.
شما ممکنه برای یک مورد خاص اینطوری مفسر بنویسید که داخل content دنبال title بگرده و مشابه attribute تفسیرش کنه ولی این جزو قواعد XML نیست، کلا در XML جای attribute باید داخل خود تگ باشه.

3) کدهای شماره ی 2 را به شکل زیر نمیشه نوشت . درسته؟ :
کد:
<window  "New Window">

</window>

خیلی ممنون استاد :rose:
نه. attribute باید اسم داشته باشه.
 

the_king

مدیرکل انجمن
استاد ، طبق توضیحات تون ، پس پروپرتیِ Margin ، نباید شی Thikness ای که بهش عدد میدیم ، این اعداد ، بر حسب پیکسل باشند .
پس باید بر حسب درصد یا چیزی شبیه به تین باشند .
درسته؟
اگه مثلا بر حسب پیکسل باشند و ما وقتی ۵۰ بدیم ، توی هر ریزوایشن ای که کنترل (یا در ووقع به کنترل در wpf ، المنت میگن . درسته؟) یا المنت parent مون تغییر کنه ، باز در هر ریزولیشن ای ، همون ۵۰ پیکسل فاصله خواهد داشت و فاصله و اندازه اش تغییری نمیکنه.
درسته؟

توی توضیحات پروپرتی Margin انگار نوشته که این مقدارش ، نسبت به المنت (کنترل) والد یا کنترل های خواهر و برادرش قیاس و اِعمال میشه. البته اگه من درست متوجه شده باشم.
حالا اگه درسته ، چجوری میشه که مقدار Margin یک کنترل ، نسبت به دو کنترل قیاس میشه؟!
بعد هم میگفت که این مقدار ، در المنت های خواهر و برادر ، افزوده شدنی هستن . مثلا وقتی دو المنت و کنترلِ خواهر و برادر را ۳۰ بدیم ، ۶۰ واحد (حالا نمیدونم منظورش پیکسل هست یا نه) از هم فاصله میگیرند .
چرا این طوره و این اضافه شدن ، قضیه اش چیه؟
مثل فتوشاپ و کورل دراو و سایر برنامه گرافیکی که مقیاس های متفاوتی دارند ئه. شما در فتوشاپ می توانید بگید یک مستطیل در ابعاد 10 در 10 پیکسل بکشه یا 10 در 10 میلی متر یا 10 در 10 سانتی متر. طبعا واحد پیکسل در نمایشگر و چاپگر با dpi متفاوت ریز و درشت میشه و واحد میلی متر و سانتی متر تعداد پیکسل های کمتر و بیشتری بکار میبره تا همچنان همون طول رو حفظ کنه.
تعیین معیاری مثل پیکسل برای WPF استفاده خیلی محدودی داره، چون فلسفه WPF اینه که در نمایشگر ها با ابعاد متفاوت در اندازه مناسبی دیده بشه. مناسب به این معنی نیست که خیلی ریز یا خیلی درشته بشه.
طبعا 50 پیکسل برای مانیتور 96dpi و گوشی 550dpi خیلی با فرق می کنه. میخواهیم حتما 50 پیکسل نمایش داده بشه تا در dpi بالا خیلی ریز دیده بشه و چشم کاربر دربیاد؟
Margin فاصله ای بین یک شیء از سایر اجزاء در نظر میگیره. انگار که کادر نامرئی شیء به اون اندازه Margin بزرگتر شده باشه. برای اینکه اشیاء بهم نچسبند.
وقتی دو شیء نزدیک هم بشن که هر دوشون Margin دارند، به اندازه مجموع Margin بین شون فاصله میگیرند، یعنی کادر نامرئی اشیاء بهم میچسبند ولی اشیاء داخلش هر کدوم به اندازه Margin شیء از کادر نامرئی فاصله دارند.
 

SajjadKhati

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

نه برابر نیست. دومی attribute ئه، اولی بصورت attribute تفسیر نمیشه. در اولی شما یک content نوشته اید بصورت "title = "New Window که از اول تا آخرش فقط یک متن ئه، قاعده نگارش attribute رو هم داخلش رعایت بکنید همچنان یک متن ئه، ظاهر attribute داره ولی فقط ظاهر ئ نیست. content به اجزاء خاصی تفکیک و تفسیر نمیشه. content جای نوشتن attribute نیست. attribute باید داخل خود تگ window نوشته بشه، نه بین تگ شروع و پایان، بین تگ شروع و پایان برای content ئه.
شما ممکنه برای یک مورد خاص اینطوری مفسر بنویسید که داخل content دنبال title بگرده و مشابه attribute تفسیرش کنه ولی این جزو قواعد XML نیست، کلا در XML جای attribute باید داخل خود تگ باشه.


نه. attribute باید اسم داشته باشه.

آها .
خیلی ممنون استاد .
پس attributes همون content نیست .
attributes ، داخل تگ نوشته میشه اما content بین تگ ها .
پس چه زمانی متوجه بشیم که باید یه چیز را بصورت attributes بنویسیم یا بصورت content ؟
مثلا همین title را باید بصورت attributes نوشت یا بصورت content ؟ (فعلا کاری به مفسر ویژال استودیوبرای xml که در wpf هست ، ندارم . کلا میگم)
attributes ها را اگه بخوایم مثال بزنیم ، شبیه پروپرتی ها در سی شارپ هستند؟ (همونطور که گفتید ، قصد ندارم xml را با سی شارپ مقایسه کنم . ولی میگم اگه شباهتی بخوایم در نظر بگیریم ، همچین شباهتی هست؟)
 

the_king

مدیرکل انجمن
آها .
پس چه زمانی متوجه بشیم که باید یه چیز را بصورت attributes بنویسیم یا بصورت content ؟
یک چیز باید تعریف داشته باشه، بدون دلیل و استفاده که نوشته نمیشه. در همونجا که تعریف شده مشخص شده کجا و برای چه منظوری نوشته بشه.
مثلا همین title را باید بصورت attributes نوشت یا بصورت content ؟ (فعلا کاری به مفسر ویژال استودیوبرای xml که در wpf هست ، ندارم . کلا میگم)
بایدش رو XML مشخص نمی کنه، مستندات اون چیزی مشخص میکنه که بخاطرش دارید در قالب XML چیزی می نویسید، برای خود XML که Title معنی خاصی نداره.
اینکه Title اصلا چی هست و چه معنی ای داره و کجا نوشته میشه، مربوط به تعریف خاصی است که بر اساس اون تعریف هم میدونید attribute ئه یا Content ئه.

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
خیلی ممنون استاد.
استاد ، اینهایی که در زیر درباره ی فضای نام در xml میگم را درست میگم؟ همچنین چند تا سئوال هم داشتم :

طبق لینک زیر :
XML Namespaces

یا فضای نام پیش فرض داریم یا اینکه پیشوندی برای اون فضای نام تعریف کنیم که اون پیشوند را در تمام جاهای اون element مربوطه ، قرار بدیم.
کلا یک فضای نام (چه پیش فرض باشه یا نه) ، برای همون المنت و همچنین برای فرزندان و نوادگانِ اون المنت خواهد بود که براش اون فضای نام را تعریف کردیم.

هر فضای نام ای را که تعریف میکنیم (چه پیش فرض یا نه) ، باید اتریباتسِ xmlns که احتمالا مخفف XmlNameSpace هست را باید برای اون المنت ، در نظر بگیریم. و چون xmlns یک اتریباتس هست و اتریباتس ها هم در تگِ باز تعریف میشن (نه بین تگ ها) ، پس فضای نام ها باید درون تگ ها و المنت ها تعریف بشن نه بین تگ ها یا content هاشون.

اگه فضای نام مون بصورت پیش فرض باشه ، پیشوندی نخواهد داشت. بصورت زیر تعریف میشه :
xmlns = "مقدار انحصاری"

اگه فضای نام مون بصورت غیر پیش فرض یا همون دارای پیشوند باشه ، بصورت زیر تعریف میشه :
xmlns : prefix = "مقدار انحصاری"
و این پیشوند را باید در همون المنت و تمام زیر مجموعه ی اون المنت استفاده کنیم یعنی این جوری بنویسیم :

کد:
<pr : Window xlmns:pr= "1"   Title ="New">
<pr : Gride>
</pr : Gride>
</pr : Window>

و همچنین ، هر المنت به همراه زیر مجموعه اش ، فقط یک فضای نام میتونن داشته باشند.

اینهایی که گفتم ، درست هستند؟

حالا سئوالاتم :
طبق کدهای داخل 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" Height="350" Width="525">
    <Grid>
      
    </Grid>
</Window>

۱) این فقط یک فضای نام پیش فرض تعریف کرد که در خط دوم ، یعنی خط زیر هست :

کد:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

بنابراین همین فضای نام باید برای المنت و تگ Window و فرزندانش (مثل Gride) استفاده بشه.
پس چرا ۴ تا فضای نام دیگه با پیشوند تعریف کرد؟
اولا این ۴ تا فضای نام را که استفاده نکرد.
دوما این ۴ تا فضای نام که در تگ Window با پیشوند تعریف کرد ، مگه در تگ Window و فرزندانش ، میتونن استفاده بشن؟
در تگ Window و فرزندانش که فقط از فضای نام پیش فرض داره استفاده میشه.
پس وقتی نمیشه استفاده بشه ، پس چرا این ۴ تا فضای نام را تعریف کرد؟
اصلا این ۴ تا فضای نام استفاده هم بشه ، این پس چرا استفاده نکرد؟ یعنی در هیچ تگ دیگه ای ، نامِ اون پیشوندهایی که در اون ۴ تا فضای نام را برد ، فراخونی نکرد .
پس چرا وقتی استفاده نکرد ، الکی تعریف کرد؟

۲) خط هایی که فضای نام نیستن (چون با اتریباتسِ xmlns شروع نشدن) ، پس چی هستن؟
مثل خط اول :
کد:
x:Class="WPF_Practice.MainWindow"

و خط :
کد:
mc:Ignorable="d"

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

the_king

مدیرکل انجمن
سلامی مجدد
خیلی ممنون استاد.
استاد ، اینهایی که در زیر درباره ی فضای نام در xml میگم را درست میگم؟ همچنین چند تا سئوال هم داشتم :

طبق لینک زیر :
XML Namespaces

یا فضای نام پیش فرض داریم یا اینکه پیشوندی برای اون فضای نام تعریف کنیم که اون پیشوند را در تمام جاهای اون element مربوطه ، قرار بدیم.
کلا یک فضای نام (چه پیش فرض باشه یا نه) ، برای همون المنت و همچنین برای فرزندان و نوادگانِ اون المنت خواهد بود که براش اون فضای نام را تعریف کردیم.

هر فضای نام ای را که تعریف میکنیم (چه پیش فرض یا نه) ، باید اتریباتسِ xmlns که احتمالا مخفف XmlNameSpace هست را باید برای اون المنت ، در نظر بگیریم. و چون xmlns یک اتریباتس هست و اتریباتس ها هم در تگِ باز تعریف میشن (نه بین تگ ها) ، پس فضای نام ها باید درون تگ ها و المنت ها تعریف بشن نه بین تگ ها یا content هاشون.

اگه فضای نام مون بصورت پیش فرض باشه ، پیشوندی نخواهد داشت. بصورت زیر تعریف میشه :
xmlns = "مقدار انحصاری"

اگه فضای نام مون بصورت غیر پیش فرض یا همون دارای پیشوند باشه ، بصورت زیر تعریف میشه :
xmlns : prefix = "مقدار انحصاری"
و این پیشوند را باید در همون المنت و تمام زیر مجموعه ی اون المنت استفاده کنیم یعنی این جوری بنویسیم :

کد:
<pr : Window xlmns:pr= "1"   Title ="New">
<pr : Gride>
</pr : Gride>
</pr : Window>
بله.
و همچنین ، هر المنت به همراه زیر مجموعه اش ، فقط یک فضای نام میتونن داشته باشند.
خیر. هر تگ مستقل ئه.
حالا سئوالاتم :
طبق کدهای داخل 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" Height="350" Width="525">
    <Grid>
     
    </Grid>
</Window>

۱) این فقط یک فضای نام پیش فرض تعریف کرد که در خط دوم ، یعنی خط زیر هست :

کد:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

بنابراین همین فضای نام باید برای المنت و تگ Window و فرزندانش (مثل Gride) استفاده بشه.
پس چرا ۴ تا فضای نام دیگه با پیشوند تعریف کرد؟
اولا این ۴ تا فضای نام را که استفاده نکرد.
دوما این ۴ تا فضای نام که در تگ Window با پیشوند تعریف کرد ، مگه در تگ Window و فرزندانش ، میتونن استفاده بشن؟
در تگ Window و فرزندانش که فقط از فضای نام پیش فرض داره استفاده میشه.
پس وقتی نمیشه استفاده بشه ، پس چرا این ۴ تا فضای نام را تعریف کرد؟
اصلا این ۴ تا فضای نام استفاده هم بشه ، این پس چرا استفاده نکرد؟ یعنی در هیچ تگ دیگه ای ، نامِ اون پیشوندهایی که در اون ۴ تا فضای نام را برد ، فراخونی نکرد .
پس چرا وقتی استفاده نکرد ، الکی تعریف کرد؟
مشابهش رو در پروژه های Windows Forms هم می بینید، وقتی یک کلاس یا فرم جدید ایجاد می کنید تعداد زیادی using بصورت خودکار نوشته میشه، بدون توجه به اینکه در اون حالت اولیه وجودشون لازم هست یا نه.
از خیلی هاشون هم ممکنه تا پایان پروژه همچنان استفاده نکنید و اضافی باشند. کد خودکاری که ایجاد میشه فقط شامل موارد ضروری نیست، میتونه مواردی داخلش باشه که بعدا ممکنه استفاده بشه یا نشه.

۲) خط هایی که فضای نام نیستن (چون با اتریباتسِ xmlns شروع نشدن) ، پس چی هستن؟
مثل خط اول :
کد:
x:Class="WPF_Practice.MainWindow"

و خط :
کد:
mc:Ignorable="d"
attribute هستند، مثل سایر attribute ها. معنی و کاربرد این صفات جزو تعاریف XML نیست، مربوط به خود WPF ئه. و اگر دقت کنید این صفات با یک پیشوند شروع میشن که قبلا namespace اون پیشوند مشخص شده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیر. هر تگ مستقل ئه.

خیلی ممنون استاد .
پس چرا اون لینک گفته :
کد:
When a namespace is defined for an element, all child elements with the same prefix are associated with the same namespace.

یعنی یک فضای نام را وقتی برای یک المنت و تگ تعریف میکنیم ، همه ی فرزندارن اون المنت ، اون فضای نام را دارند .
درست گفتم دیگه؟
و مثال زد :
کد:
<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

همونطور که در کد بالا میبینیم ، تگ td و tr ، همون پسوند h ای را دارند که تگ پدرشون ، یعنی تگ table داره .
یعنی تگ های فرزندش ، فضای نام جداگانه ای ندارند .
همینطور برای اون تگ دیگه که پسوند f را داره هم همینطوره و تمام تگ های فرزندش هم همین پیشوند را دارن .

یه مثال میزنید؟ (اینکه گفتید فضای نام تگ های فرزند ، میتونند جدای از فضای نام تگ پدر باشند)

مشابهش رو در پروژه های Windows Forms هم می بینید، وقتی یک کلاس یا فرم جدید ایجاد می کنید تعداد زیادی using بصورت خودکار نوشته میشه، بدون توجه به اینکه در اون حالت اولیه وجودشون لازم هست یا نه.
از خیلی هاشون هم ممکنه تا پایان پروژه همچنان استفاده نکنید و اضافی باشند. کد خودکاری که ایجاد میشه فقط شامل موارد ضروری نیست، میتونه مواردی داخلش باشه که بعدا ممکنه استفاده بشه یا نشه.

آها . خیلی ممنون . متوجه شدم .
اما یه نکته ای که میشه در نظر گرفت اینه که اونجا که using بکار میبریم ، داریم از فضای نام ای که قبلا تعریف کرده بودیم ، استفاده و فراخونی میکنیم .
اما در اینجا ، فضای نام را تعریف کرد . فراخونی نکرد جهت استفاده کردن یا نکردن . (اینها در xml ، تعریف فضای نام هستن دیگه . درسته؟)

attribute هستند، مثل سایر attribute ها. معنی و کاربرد این صفات جزو تعاریف XML نیست، مربوط به خود WPF ئه. و اگر دقت کنید این صفات با یک پیشوند شروع میشن که قبلا namespace اون پیشوند مشخص شده.

بله . تازه دقت کردم . اتریباتسِ این دو کد ، با پیشوندی شروع میشه که قبلا در کد بالا اش تعریف شده ولی 3 سئوال :

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

2) مگه کدهای xml ، خط به خط تفسیر نمیشن؟ اگه نه ، پس چجوری تفسیر میشن؟ اگه آره ، پس چرا در wpf ، در خط اول ، کد :
کد:
x:Class="WPF_Practice.MainWindow"
را نوشت و تازه در خط سوم ، این فضای نام با پیشوند x را تعریف کرد؟ :
کد:
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

3) اما هنوز متوجه نشدم این دو خط ، چی هستند و کارشون چیه؟
گفتید مربوط به wpf هه .
خوب ، باید برای کاری باشن دیگه . درسته؟
کار این دو خط چیه؟
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
پس چرا اون لینک گفته :
کد:
When a namespace is defined for an element, all child elements with the same prefix are associated with the same namespace.

یعنی یک فضای نام را وقتی برای یک المنت و تگ تعریف میکنیم ، همه ی فرزندارن اون المنت ، اون فضای نام را دارند .
درست گفتم دیگه؟
شما all child elements with the same prefix رو همه فرزندان المنت ترجمه کردید، نه همه فرزندانی که همون پیشوند را دارند، در جمله تون with the same prefix رو چی ترجمه کردید؟ حذفش کردید.
در مورد فرزندانی که پیشوند متفاوتی دارند که حرفی نزده.
کد:
When a namespace is defined for an element
وقتی برای یک المنت فضای نام تعریف شده
all child elements with the same prefix
تمامی المنت های فرزند که همون پیشوند (پیشوند والد) رو دارند
are associated with the same namespace.
با همان فضای نام (فضای نام والد) مرتبط هستند.

یه مثال میزنید؟ (اینکه گفتید فضای نام تگ های فرزند ، میتونند جدای از فضای نام تگ پدر باشند)
به تفاوت فضای نام تگ والد student و فضای نام تگ های فرزند result و cv توجه کنید :
prefix.png
XML Namespaces

آها . خیلی ممنون . متوجه شدم .
اما یه نکته ای که میشه در نظر گرفت اینه که اونجا که using بکار میبریم ، داریم از فضای نام ای که قبلا تعریف کرده بودیم ، استفاده و فراخونی میکنیم .
اما در اینجا ، فضای نام را تعریف کرد . فراخونی نکرد جهت استفاده کردن یا نکردن . (اینها در xml ، تعریف فضای نام هستن دیگه . درسته؟)
در XML اعلان و تعریف کردن (declaration و define) یک فضای نام یک کار و یک معنی است چون فراخوانی فضای نام در XML معنی نداره.
من using رو با xmlns مقایسه نکردم، روال درج خودکار کد Designer فرم رو با روال درج خودکار کد Designer ئه WPF مقایسه کردم.

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

2) مگه کدهای xml ، خط به خط تفسیر نمیشن؟ اگه نه ، پس چجوری تفسیر میشن؟ اگه آره ، پس چرا در wpf ، در خط اول ، کد :
کد:
x:Class="WPF_Practice.MainWindow"
را نوشت و تازه در خط سوم ، این فضای نام با پیشوند x را تعریف کرد؟ :
کد:
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
لزومی نداره که attribute ها با ترتیب خاصی درج بشن. کد XML بصورت خطی خونده و تفسیر میشه، یعنی خط به خط خونده میشه و به تدریج تفسیر میشه.
ولی معنی اش این نیست که چون در سطری نوشته شده Window> همین الان باید تگ Window رو تفسیر کنه و پرونده تگ رو ببنده.
تا وقتی سطر های بعدی رو نخونده حتی مشخص نیست که این تگ شروع ئه یا مثل </ Window> یک تگ کامل و بدون نیاز به تگ پایانی است.
وقتی یک تگ میتونه تفسیر بشه که لااقل معلوم بشه ته اش کجا است، وقتی هنوز < خونده نشده که تفسیر تگ کامل نیست.

3) اما هنوز متوجه نشدم این دو خط ، چی هستند و کارشون چیه؟
گفتید مربوط به wpf هه .
خوب ، باید برای کاری باشن دیگه . درسته؟
کار این دو خط چیه؟
برای اینکه متوجه بشید چی هستند و کارشون در WPF چیه باید چه کاری انجام می دادید؟ اون کار رو انجامش دادید که میگید هنوز متوجه نشدم؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شما all child elements with the same prefix رو همه فرزندان المنت ترجمه کردید، نه همه فرزندانی که همون پیشوند را دارند، در جمله تون with the same prefix رو چی ترجمه کردید؟ حذفش کردید.
در مورد فرزندانی که پیشوند متفاوتی دارند که حرفی نزده.
کد:
When a namespace is defined for an element
وقتی برای یک المنت فضای نام تعریف شده
all child elements with the same prefix
تمامی المنت های فرزند که همون پیشوند (پیشوند والد) رو دارند
are associated with the same namespace.
با همان فضای نام (فضای نام والد) مرتبط هستند.


به تفاوت فضای نام تگ والد student و فضای نام تگ های فرزند result و cv توجه کنید :
مشاهده پیوست 113390
XML Namespaces

خیلی ممنون استاد .
پس میشه درون یک تگ ، چند فضای نام (به عنوان اتریباتس) تعریف کرد و در هر تگِ فرزندش یا حتی در هر عضو و content از فرزندانش (چه تگ باشند یا نه) ، یکی از اون پیشوندهای مربوط به فضاهای نام تعریف شده را براش بکار برد . درسته ؟
اما این مثالی که دادید ، اشتباه تایپی توش هست دیگه . درسته؟
چون من این کد را توی مرورگر اجرا کردم و ارور داد . در قسمتی که پیشوند r را برای تگ result بکار برد . باید پیشوند res را در اونجا بکار میبرد دیگه . درسته؟ یعنی باید این جوری مینوشت :

کد:
<?xml version="1.0" encoding="UTF-8"?>

<s:student xmlns:s="http://www.way2tutorial.com/some_url1"
           xmlns:res="http://www.way2tutorial.com/some_url2">
  <res:result>
    <res:name>Opal Kole</res:name>
    <res:sgpa>8.1</res:sgpa> 
    <res:cgpa>8.4</res:cgpa>   
  </res:result>
  <res:cv>
    <res:name>Opal Kole</res:name> 
    <res:cgpa>8.4</res:cgpa>   
  </res:cv>
</s:student>



در XML اعلان و تعریف کردن (declaration و define) یک فضای نام یک کار و یک معنی است چون فراخوانی فضای نام در XML معنی نداره.
من using رو با xmlns مقایسه نکردم، روال درج خودکار کد Designer فرم رو با روال درج خودکار کد Designer ئه WPF مقایسه کردم.


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


لزومی نداره که attribute ها با ترتیب خاصی درج بشن. کد XML بصورت خطی خونده و تفسیر میشه، یعنی خط به خط خونده میشه و به تدریج تفسیر میشه.
ولی معنی اش این نیست که چون در سطری نوشته شده Window> همین الان باید تگ Window رو تفسیر کنه و پرونده تگ رو ببنده.
تا وقتی سطر های بعدی رو نخونده حتی مشخص نیست که این تگ شروع ئه یا مثل </ Window> یک تگ کامل و بدون نیاز به تگ پایانی است.
وقتی یک تگ میتونه تفسیر بشه که لااقل معلوم بشه ته اش کجا است، وقتی هنوز < خونده نشده که تفسیر تگ کامل نیست.


برای اینکه متوجه بشید چی هستند و کارشون در WPF چیه باید چه کاری انجام می دادید؟ اون کار رو انجامش دادید که میگید هنوز متوجه نشدم؟

خیلی ممنون
باید این مقاله ها را بخونم؟ :green: :

x:Class Directive - WPF
و
XAML Namespaces and Namespace Mapping - WPF

اگه خلاصه کلا یه خط میگقتین چی هست ، خوب میشد ها . :green:
 

the_king

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
کد:
<Style x:Key="Style1">
  <Setter Property="Control.Background" Value="Yellow"/>
</Style>
خیلی ممنون استاد .
استاد ، الان خیلی از چیزها در wpf ، مثلا با x شروع میشن . مثل x:Key و x:Class و x:Members و x:Name و x: Propertie و ... .
یه توضیح کلی میدین که این x چیه که با اینها میاد؟ نمیخوام دونه دونه مثلا بگین که x:Class چیه و ... . کلا میخوام بدونم این x چیه که برای این چیزها میاد ؟
درباره ی x:Key هم هر چند یکی دو خط خوندم ، ولی متوجه نشدم . اگه میشه در حد یه خط توضیح میدین چیه؟ (چون خیلی جاها بکار رفته ، گفتم که بپرسم) .

اگه یه کم درباره ی کد :

کد:
<Style x:Key="Style1">
  <Setter Property="Control.Background" Value="Yellow"/>
</Style>

که در لینک زیر بود هم توضیح بدین ، خیلی ممنون میشم .

Style Class (System.Windows)
 
آخرین ویرایش:

the_king

مدیرکل انجمن
کد:
<Style x:Key="Style1">
  <Setter Property="Control.Background" Value="Yellow"/>
</Style>
خیلی ممنون استاد .
استاد ، الان خیلی از چیزها در wpf ، مثلا با x شروع میشن . مثل x:Key و x:Class و x:Members و x:Name و x: Propertie و ... .
یه توضیح کلی میدین که این x چیه که با اینها میاد؟ نمیخوام دونه دونه مثلا بگین که x:Class چیه و ... . کلا میخوام بدونم این x چیه که برای این چیزها میاد ؟
فقط یک پیشوند ئه که WPF برای استفاده خودش تعریف کرده. y نیست چون طراحان اش اسمش رو x گذاشته اند. x باید باشه تا یک گروه از تگ ها از موارد دیگه تفکیک بشن.
اگر شما هم میخواستید در قالب XML همچین چیزی مثل WPF رو تعریف کنید برای تفکیک بخش های مختلف پیشوند تعریف می کردید.
درباره ی x:Key هم هر چند یکی دو خط خوندم ، ولی متوجه نشدم . اگه میشه در حد یه خط توضیح میدین چیه؟ (چون خیلی جاها بکار رفته ، گفتم که بپرسم) .
چرا یکی دو خط؟ فقط یکی دو خط که موجود نبوده، مطلب کامل بوده، خودتون نخواستید بیشتر از اون بخونید. x:Key Directive
اگه در جایی در مورد چیزی چند صفحه شرح نوشته و شما فقط یکی دو خط از اون شرح رو میخونید، یعنی تمایل آنچنانی به مطالعه در موردش رو ندارید.
چرا اصرار دارید چیزی رو متوجه بشید که حوصله مطالعه در موردش رو ندارید؟
 

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

بالا