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

the_king

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
گمان نمی کنم، چون حتی اگه بخواهید با دستکاری Template کاری رو انجام بدهید باید از همین مشخصه های کنترل استفاده کنید که روال شون تغییر نکرده.
البته کاری که می کنید غیر عادیه، اینکه متن ComboBox قابل ویرایش نباشه ولی متنی رو انتخاب کنه که در لیست اش نباشه عجیب و غریبه.
احتمالا قصد دارید کاری رو انجام بدهید که فکر می کنید برای اجراش باید به Text مقدار بدهید در حالی که روش انجام دیگری بجز تعیین مقدار برای Text داره.

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

the_king

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

SajjadKhati

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

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

البته میشه توی تمپلیت این طور کرد که وقتی Editable مقدار true داشت و همچنین IsReadOnly مقدار false داشت ، فقط در این صورت ، تغییر شکل به حالت editable بده (چون اگه اشتباه نکنم ، وقتی IsReadOnly فعال باشه ، دیگه عملا فعال بودن یا نبودن Editable (بجز در ظاهر) ، فرقی نداره و کاربردی نداره . درست میگم؟) . الان به نظرتون همچین چیزی را پیاده سازی و اجرا کنم؟ یا نظر دیگه ای دارین؟

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

من نمیدونم چرا مایکروسافت گاها همچین کارهایی میکنه . این کاملا مشخص هست که قضیه ی Text ای که توی کنترل کمبوباکس winform بود ، بدون وابستگی به پروپرتی های دیگه مثل Editable ، برای کمبوباکس wpf هم کاربرد داره اما چرا به پروپرتی Editable در wpf وابسته اش کردن ، معلوم نیست!
تشکر استاد :rose:
 

the_king

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

من نمیدونم چرا مایکروسافت گاها همچین کارهایی میکنه . این کاملا مشخص هست که قضیه ی Text ای که توی کنترل کمبوباکس winform بود ، بدون وابستگی به پروپرتی های دیگه مثل Editable ، برای کمبوباکس wpf هم کاربرد داره اما چرا به پروپرتی Editable در wpf وابسته اش کردن ، معلوم نیست!
شما مگه عملکرد کنترل ComboBox در Windows Forms رو میشناسید که در مورد نسخه WPF اش انتقاد می کنید؟
لطف کنید و قبل از اینکه در مورد طراحی کنترل ComboBox در WPF نظر بدهید طرز عملکرد Text در کنترل ComboBox ئه Windows Forms رو بررسی کنید.
شما میگید عملکرد Text به دیگر مشخصه های ComboBox وابستگی نداره، چرا این حرف رو میزنید؟ چون بدون اینکه ComboBox رو بشناسید تحلیل اش می کنید. بدون اینکه دانش اش رو داشته باشید در مورد عملکرد مایکروسافت انتقاد می کنید. چرا مایکروسافت همچین کارهایی رو می کنه؟ مرگ بر مایکروسافت.
C#:
            var cmb = new ComboBox();
            cmb.Items.Add("One");
            cmb.Items.Add("Two");
            cmb.Items.Add("Three");
            cmb.DropDownStyle = ComboBoxStyle.DropDownList;
            cmb.Text = "Sample";
            MessageBox.Show(cmb.Text);

C#:
            var cmb = new ComboBox();
            cmb.Items.Add("One");
            cmb.Items.Add("Two");
            cmb.Items.Add("Three");
            cmb.DropDownStyle = ComboBoxStyle.DropDown;
            cmb.Text = "Sample";
            MessageBox.Show(cmb.Text);
 

SajjadKhati

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


شما مگه عملکرد کنترل ComboBox در Windows Forms رو میشناسید که در مورد نسخه WPF اش انتقاد می کنید؟
لطف کنید و قبل از اینکه در مورد طراحی کنترل ComboBox در WPF نظر بدهید طرز عملکرد Text در کنترل ComboBox ئه Windows Forms رو بررسی کنید.
شما میگید عملکرد Text به دیگر مشخصه های ComboBox وابستگی نداره، چرا این حرف رو میزنید؟ چون بدون اینکه ComboBox رو بشناسید تحلیل اش می کنید. بدون اینکه دانش اش رو داشته باشید در مورد عملکرد مایکروسافت انتقاد می کنید. چرا مایکروسافت همچین کارهایی رو می کنه؟ مرگ بر مایکروسافت.
C#:
            var cmb = new ComboBox();
            cmb.Items.Add("One");
            cmb.Items.Add("Two");
            cmb.Items.Add("Three");
            cmb.DropDownStyle = ComboBoxStyle.DropDownList;
            cmb.Text = "Sample";
            MessageBox.Show(cmb.Text);

C#:
            var cmb = new ComboBox();
            cmb.Items.Add("One");
            cmb.Items.Add("Two");
            cmb.Items.Add("Three");
            cmb.DropDownStyle = ComboBoxStyle.DropDown;
            cmb.Text = "Sample";
            MessageBox.Show(cmb.Text);

خیلی ممنون استاد .
توی تمپلیت کمبوباکس ، Content ئه ContentPresenter را بجای بایندینگ کردن به پروپرتی SelectionBoxItem ئه کمبوباکس ، به پروپرتی Text بایندینگ کردم ، درست شد .

کمبوباکس winform هم همینجوری هه؟ :green:
توی پروژه ی winform (قبلی ام که یه خورده از طراحی پروژه را توش انجام داده بودم و بعد رها کردم و اومدم wpf یاد بگیرم) ، از کمبوباکس تلریک استفاده کرده بودم (با کمبوباکس winform ئه مایکروسافت اشتباه گرفته بودم) .
تشکر استاد . :rose:
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
توی تمپلیت کمبوباکس ، Content ئه ContentPresenter را بجای بایندینگ کردن به پروپرتی SelectionBoxItem ئه کمبوباکس ، به پروپرتی Text بایندینگ کردم ، درست شد .
نمیشه گفت درست، کارکرد SelectionBoxItem رو ناقص کرده اید. SelectionBoxItem یک object ئه، Text یک string ئه.
فرض کنید که آیتم های داخل ComboBox اشیاء پیچیده ای باشند، مثلا بجای سه تا string، سه تا Ellipse باشند، Ellipse باید خودش داخل ContentPresenter قرار بگیره تا رسم بشه، نمیشه با یک string معادل بشه. بین Ellipse و string ارتباط ظاهری ای نیست که بخواد داخل ContentPresenter نمایش داده بشه.
 

the_king

مدیرکل انجمن
توی پروژه ی winform (قبلی ام که یه خورده از طراحی پروژه را توش انجام داده بودم و بعد رها کردم و اومدم wpf یاد بگیرم) ، از کمبوباکس تلریک استفاده کرده بودم (با کمبوباکس winform ئه مایکروسافت اشتباه گرفته بودم) .
در کنترل های تلریک هم که همون روال ئه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نمیشه گفت درست، کارکرد SelectionBoxItem رو ناقص کرده اید. SelectionBoxItem یک object ئه، Text یک string ئه.
فرض کنید که آیتم های داخل ComboBox اشیاء پیچیده ای باشند، مثلا بجای سه تا string، سه تا Ellipse باشند، Ellipse باید خودش داخل ContentPresenter قرار بگیره تا رسم بشه، نمیشه با یک string معادل بشه. بین Ellipse و string ارتباط ظاهری ای نیست که بخواد داخل ContentPresenter نمایش داده بشه.

خیلی ممنون استاد .
بله درست میگید .
بایندینگِ پروپرتیِ Content ئه ContentPresenter را به همون پروپرتیِ SelectionBoxItem برگردوندم .
اما یه trigger نوشتم که اگه مقدار SelectedItem ئه کمبوباکس ، نال بود پروپرتیِ Content ئه ContentPresenter را به پروپرتیِ Text ئه اون کمبوباکس متصل کنه .

کارکرد پروپرتی های SelectedItem و SelectionBoxItem ، یکی هست دیگه؟
الان مشکلی نداره . درسته؟


در کنترل های تلریک هم که همون روال ئه.

ولی من از کنترل تلریک RadDropDownList ئه winform استفاده کردم و پروپرتیِ Text اش را ست کردم و قابلیت editable اش غیر فعال هست و متنِ ست شده را نمایش میده .
تشکر استاد .
 

the_king

مدیرکل انجمن
کارکرد پروپرتی های SelectedItem و SelectionBoxItem ، یکی هست دیگه؟
کارکرد نه، دقیقا یکی نیستند. چون Selector.SelectedItem در ماهیت کاری با ظاهر کنترل نداره، در حالی که SelectionBoxItem مربوط به نمایش ئه و فقط خواندنی ئه، در حالی که Selector.SelectedItem قابل مقدار دهی است. اما از نظر مقداری مشابه هستند.

الان مشکلی نداره . درسته؟
موردی به ذهنم نمیرسه.

ولی من از کنترل تلریک RadDropDownList ئه winform استفاده کردم و پروپرتیِ Text اش را ست کردم و قابلیت editable اش غیر فعال هست و متنِ ست شده را نمایش میده .
به این خاطر که در کنترل RadDropDownList تغییر مقدار مشخصه Text کاری با آیتم انتخاب شده نداره، واسه خودش مستقل ئه.
C#:
            var cmb = new ComboBox();
            cmb.Items.Add("One");
            cmb.Items.Add("Two");
            cmb.Items.Add("Three");
            cmb.DropDownStyle = ComboBoxStyle.DropDownList;
            cmb.Text = "Two";
            MessageBox.Show((cmb.SelectedItem?.ToString() ?? "null") + " " + cmb.SelectedIndex);

C#:
            var cmb = new Telerik.WinControls.UI.RadDropDownList();
            cmb.Items.Add("One");
            cmb.Items.Add("Two");
            cmb.Items.Add("Three");
            cmb.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDownList;
            cmb.Text = "Two";
            MessageBox.Show((cmb.SelectedItem?.ToString() ?? "null") + " " + cmb.SelectedIndex);
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد
استاد ، کنترل های winform در پنجره ی Properties در ویژال استودیو ، یه پروپرتیِ Lock داره که احیانا و اشتباها دست طرف نخوره تا چیدمان و تنظیمات کنترل ها به هم بریزه ، این قابلیت برای کنترل های wpf وجود نداره؟
یا راهکاری برای انجام این کار برای کنترل های wpf نیست؟

من معمولا عادت داشتم که کارِ چیدمانم با کنترل ها تمام شد ، اونها را قفل کنم تا اشتباها بعدا دستم به کنترل ها خورد ، چیدمان شون تغییر نکنه (موس ام هم مشکل کلیک سخت افزاری هم داره یه کم که این احتمال را بیشتر میکنه) .

بعد نمیدونم چرا به BorderThickness ئه GroupBox ، مقداری پایین تر از 1 میدیم ، در xaml designer خط حاشیه شو نشون نمیده اما زمان اجرا ، نشون میده .
همچنین در این حالت ، وقتی BorderBrush اش را یه رنگی تنظیم میکنیم ، دقیقا انگار اون رنگ انتخاب نمیشه .
تشکر
 

SajjadKhati

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

XML:
                                            <TextBlock Name="AutoBackupingCheckBoxDriveName_TextBlock" >
                                                    این یک متن <Bold Name="BoldText">بولد</Bold> هست
                                            </TextBlock>

میتونم بعدا در سی شارپ کدی بنویسم که فقط بتونم مقدار عبارت "بولد" که در کد بالا هست (با نام BoldText) را عوض کنم؟ به بقیه ی متن ها کاری ندارم .
اگه آره ، کد سی شارپ اش چجوری میشه؟
تشکر .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد
استاد ، کنترل های winform در پنجره ی Properties در ویژال استودیو ، یه پروپرتیِ Lock داره که احیانا و اشتباها دست طرف نخوره تا چیدمان و تنظیمات کنترل ها به هم بریزه ، این قابلیت برای کنترل های wpf وجود نداره؟
یا راهکاری برای انجام این کار برای کنترل های wpf نیست؟
منوی View > Other Windows > Document Outline سمت راست آیتم ها آیکون های Lock داره.

بعد نمیدونم چرا به BorderThickness ئه GroupBox ، مقداری پایین تر از 1 میدیم ، در xaml designer خط حاشیه شو نشون نمیده اما زمان اجرا ، نشون میده.
البته نه اینکه اصلا نشون نده، مثلا من خط 0.75 رو می بینم. اما به هر حال نحوه رندر زمان طراحی و رندر زمان اجرا کاملا مستقل هستند.

و همچنین استاد در کد زیر :

XML:
                                            <TextBlock Name="AutoBackupingCheckBoxDriveName_TextBlock" >
                                                    این یک متن <Bold Name="BoldText">بولد</Bold> هست
                                            </TextBlock>

میتونم بعدا در سی شارپ کدی بنویسم که فقط بتونم مقدار عبارت "بولد" که در کد بالا هست (با نام BoldText) را عوض کنم؟ به بقیه ی متن ها کاری ندارم .
اگه آره ، کد سی شارپ اش چجوری میشه؟
تشکر .
یک چیزی شبیه به این :
C#:
            BoldText.Inlines.Clear();
            BoldText.Inlines.Add("جدید");
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
استاد ، میخوام مثلا توی یه پنل (به عنوان کنترل والد) ، فونت ها (مثل FontSize) را مشخص کنم تا بقیه ی کنترل های فرزندِ اون پنل ، مقدار فونت ها را ازش بگیرن اما پنل ها در wpf از کلاس Control که فونت ها توش تعریف شدن ، ارث بری نمیکنه .

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

حالا به نظرتون این روش چطوره که (در صورت نیاز) ، یه ContentControl تعریف کنم و فونت را مشخص کنم و داخلش ، پنل ام را تعریف کنم .
اینجوری یه مشکل دیگه که داره ، یه کم تو در تویی شون زیاد میشه .
نمیدونم چرا مثل پنل های winform ، از control ارث بری نکردن؟

تشکر استاد
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
استاد ، میخوام مثلا توی یه پنل (به عنوان کنترل والد) ، فونت ها (مثل FontSize) را مشخص کنم تا بقیه ی کنترل های فرزندِ اون پنل ، مقدار فونت ها را ازش بگیرن اما پنل ها در wpf از کلاس Control که فونت ها توش تعریف شدن ، ارث بری نمیکنه .

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

حالا به نظرتون این روش چطوره که (در صورت نیاز) ، یه ContentControl تعریف کنم و فونت را مشخص کنم و داخلش ، پنل ام را تعریف کنم .
اینجوری یه مشکل دیگه که داره ، یه کم تو در تویی شون زیاد میشه .
نمیدونم چرا مثل پنل های winform ، از control ارث بری نکردن؟
Panel وارث Control نیست چون کلا کارکردش شباهتی به Control ها نداره، Panel پایه کلاس هایی است که قراره یکسری چیز داخلش قرار بگیره و قراره موقعیت اونها رو مدیریت کنه، خودش چیز خاصی نیست که کنترل واسط کاربری محسوب بشه.
اگه توضیحات کلاس Control و کلاس Panel و وارثین اش رو ببینید مشخصه که تفکیک بر اساس کارکردشون صورت گرفته.
شما می توانید Style اون نوع (حتی نوع کلی ای مثل Control) رو با Setter اش برای FontSize در جایی تعریف کنید که والد محسوب میشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شما می توانید Style اون نوع (حتی نوع کلی ای مثل Control) رو با Setter اش برای FontSize در جایی تعریف کنید که والد محسوب میشه.

خیلی ممنون استاد (همچنین از جواب بقیه ی قسمت ها) .
منظورتون اینه که Style ئه اون ShapeTextButton را توی Resource ئه پنل (ای که والدش محسوب میشه) ، مشخص کنم؟

اگه آره ، این روش را هم فکر نکنم برام کارایی داشته باشه . چون Style ئه خودِ این ShapeTextButton ، در همون قضیه ی DarkStyle و LightStyle که در فایل xaml مجزای دیگه مشخص شده (که در جریانید) ، تعریف شده که میخوام از اون استایل استفاده کنه . اما فقط FontSize اش بر اساس پنل والدش تغییر کنه.

میشه مثلا کاری کرد که وقتی به کنترل پنل میرسه ، استایل هایی که در اون DarkStyle و LightStyle (برای کنترل ShapeTextButton تعریف شده بود) را استفاده کنه اما علاوه بر اون ، یه استایلِ اضافه تر برای ShapeTextButton تعریف کنیم که فقط FontSize را مشخص میکنه؟
متوجه ی منظورم شدید؟
تشکر استاد .
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون استاد (همچنین از جواب بقیه ی قسمت ها) .
منظورتون اینه که Style ئه اون ShapeTextButton را توی Resource ئه پنل (ای که والدش محسوب میشه) ، مشخص کنم؟
نه دقیقا ShapeTextButton رو، یک نوع عمومی تر، چون فرضا فقط برای ShapeTextButton که نمیخواهید همچین کاری رو انجام بدهید.
این مثال رو ببینید :

اگه آره ، این روش را هم فکر نکنم برام کارایی داشته باشه . چون Style ئه خودِ این ShapeTextButton ، در همون قضیه ی DarkStyle و LightStyle که در فایل xaml مجزای دیگه مشخص شده (که در جریانید) ، تعریف شده که میخوام از اون استایل استفاده کنه . اما فقط FontSize اش بر اساس پنل والدش تغییر کنه.
اهمیتی نداره. هر دوشون میتونه تاثیر بذاره.

میشه مثلا کاری کرد که وقتی به کنترل پنل میرسه ، استایل هایی که در اون DarkStyle و LightStyle (برای کنترل ShapeTextButton تعریف شده بود) را استفاده کنه اما علاوه بر اون ، یه استایلِ اضافه تر برای ShapeTextButton تعریف کنیم که فقط FontSize را مشخص میکنه؟
متوجه ی منظورم شدید؟
بله. BasedOn هم که براتون موضوع جدیدی نیست و قبلا در کد ها داشتید.
اون کنترلی که از MyStyle استفاده کنه هر سه Style پیشفرض و Style ضمنی بدون نام و MyStyle رو بکار برده.
XML:
            <Style TargetType="Button">
                <Style.Setters>
                    <Setter Property="Foreground" Value="White"/>
                </Style.Setters>
            </Style>
            <Style x:Key="MyStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
                <Style.Setters>
                    <Setter Property="Background" Value="Blue"/>
                </Style.Setters>
            </Style>
 

SajjadKhati

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


اهمیتی نداره. هر دوشون میتونه تاثیر بذاره.


بله. BasedOn هم که براتون موضوع جدیدی نیست و قبلا در کد ها داشتید.
اون کنترلی که از MyStyle استفاده کنه هر سه Style پیشفرض و Style ضمنی بدون نام و MyStyle رو بکار برده.
XML:
            <Style TargetType="Button">
                <Style.Setters>
                    <Setter Property="Foreground" Value="White"/>
                </Style.Setters>
            </Style>
            <Style x:Key="MyStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
                <Style.Setters>
                    <Setter Property="Background" Value="Blue"/>
                </Style.Setters>
            </Style>

خیلی ممنون استاد .
من کد زیر را نوشتم :

XML:
            <Grid Grid.Column="0">
                <Grid.Resources>
                    <Style x:Key="{x:Type CustomControls:ShapeTextButton}" TargetType="{x:Type CustomControls:ShapeTextButton}" BasedOn="{StaticResource {x:Type CustomControls:ShapeTextButton}}">
                        <Style.Setters>
                            <Setter Property="FontSize" Value="25"/>
                        </Style.Setters>
                    </Style>
                </Grid.Resources>
                
                <CustomControls:ShapeTextButton x:Name="OkButton" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="30" Padding="0,-2,0,0"
                                        GetContentBrush_ForWhichButtonShapeProperty="Stroke"
                                        DefaultButtonShape="{StaticResource BevelShape}"
                                        MouseEnterButtonShape="{StaticResource BevelShape}"
                                        MouseDownButtonShape="{StaticResource BevelShape}"
                                        ControlDisabledButtonShape="{StaticResource BevelShape}"
                                        Content="تایید"/>

                <CustomControls:ShapeTextButton x:Name="CancelButton" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0, 40,0,0" Width="80" Height="30" Padding="0,-2, 0, 0"
                                        GetContentBrush_ForWhichButtonShapeProperty="Stroke"
                                        DefaultButtonShape="{StaticResource BevelShape}"
                                        MouseEnterButtonShape="{StaticResource BevelShape}"
                                        MouseDownButtonShape="{StaticResource BevelShape}"
                                        ControlDisabledButtonShape="{StaticResource BevelShape}"
                                        Content="لغو"
                                        Click="CancelButton_Click"/>

            </Grid>

اما در پروپرتیِ BasedOn ، ارور میده :

کد:
The resource "{x:Type CustomControls:ShapeTextButton}" could not be resolved.

استایل ای که در اون فایل DarkStyle و LightStyle تعریف کرده بودم (برای نوع ShapeTextButton) مشکلی نداره .
تشکر استاد .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
من کد زیر را نوشتم :

XML:
            <Grid Grid.Column="0">
                <Grid.Resources>
                    <Style x:Key="{x:Type CustomControls:ShapeTextButton}" TargetType="{x:Type CustomControls:ShapeTextButton}" BasedOn="{StaticResource {x:Type CustomControls:ShapeTextButton}}">
                        <Style.Setters>
                            <Setter Property="FontSize" Value="25"/>
                        </Style.Setters>
                    </Style>
                </Grid.Resources>
                
                <CustomControls:ShapeTextButton x:Name="OkButton" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="30" Padding="0,-2,0,0"
                                        GetContentBrush_ForWhichButtonShapeProperty="Stroke"
                                        DefaultButtonShape="{StaticResource BevelShape}"
                                        MouseEnterButtonShape="{StaticResource BevelShape}"
                                        MouseDownButtonShape="{StaticResource BevelShape}"
                                        ControlDisabledButtonShape="{StaticResource BevelShape}"
                                        Content="تایید"/>

                <CustomControls:ShapeTextButton x:Name="CancelButton" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0, 40,0,0" Width="80" Height="30" Padding="0,-2, 0, 0"
                                        GetContentBrush_ForWhichButtonShapeProperty="Stroke"
                                        DefaultButtonShape="{StaticResource BevelShape}"
                                        MouseEnterButtonShape="{StaticResource BevelShape}"
                                        MouseDownButtonShape="{StaticResource BevelShape}"
                                        ControlDisabledButtonShape="{StaticResource BevelShape}"
                                        Content="لغو"
                                        Click="CancelButton_Click"/>

            </Grid>

اما در پروپرتیِ BasedOn ، ارور میده :

کد:
The resource "{x:Type CustomControls:ShapeTextButton}" could not be resolved.

استایل ای که در اون فایل DarkStyle و LightStyle تعریف کرده بودم (برای نوع ShapeTextButton) مشکلی نداره .
تشکر استاد .
دو تا مساله هست، اول اینکه چرا برای Style ای که قرار نیست نام خاصی داشته باشه x:Key نوشته اید؟
ثانیا استایل پیشفرضی برای نوع ShapeTextButton توصیف شده که قراره مبنا قرار بگیره؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
دو تا مساله هست، اول اینکه چرا برای Style ای که قرار نیست نام خاصی داشته باشه x:Key نوشته اید؟
ثانیا استایل پیشفرضی برای نوع ShapeTextButton توصیف شده که قراره مبنا قرار بگیره؟

خیلی ممنون استاد
باشه ، key نمینویسم (اما فرقی هم نمیکنه توی ارور دادن یا ندادن یا درست اجرا شدن یا نشدن) .
بله ، نوشته شده که در زیر ، پیوست میکنم (شامل چندین نوع از کنترل های دیگه هم میشه که به کنترل ShapeTextButton ربطی نداره) (همون چیزی هه که قبلا در جریانید) .
اون Grid ئه ریشه که در پست 558 دادم ، خودش فرزند Window ای هست که Style ئه اون Window ، بصورت پیش فرض از استایل DarkStyle استفاده میکنه (که در فایل StyleResource.xaml هست که در فایل پیوست زیر موجود هست ، تعریف شد که در جریانید) .

تشکر استاد
 

پیوست ها

  • Style_Template.rar
    11.2 کیلوبایت · بازدیدها: 1

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

بالا