PDA

View Full Version : سوال: طراحی استایل واحد در c#



mymina
دوشنبه 25 دی 1391, 10:43 صبح
با سلام
ایا در برنامه نویسی با c# در حالت winApp امکان تعریف یک استایل واهد برای همه textbox ها و labelوجود دارد مانند حالت تعریف استایل واحد در asp و مشخص کردن کلاس توسط ابزار ها
ایا برنامه نویسی در حالت تحت ویندوز برای واحد بودن فونت و سایز label ها برای هرکدام جدا مشخص کنم ایا اگر بخواهم فونت را تغییر دهم باید تک تک این تغییرات را اعمال کنم.

hamedAdmin
دوشنبه 25 دی 1391, 11:01 صبح
سلام
بهترین کار اینه که یه کلاس تعریف کنی و استایلهایی هم که میخوای به فرمهات بدی داخل یه فایل جانبی(که میتونه داخل دیتا بیس یا فایل xml یا حتی فایل متنی باشه) قرار بدی.
این کلاس همه ی کنترلها رو با استایلی که پیش فرض هست پر میکنه؛بنابراین هر وقت هر تغییری هم بخواید به استایل برنامه بدید تنها کافیه محتوای اون فایل یا جدول دیتا بیس رو تغییر بدید!
property کنترلها رو داخل این کلاس ست کنید.
پیشنهاد من استفاده از xml هستش مخصوصا برای فرمهای winApp .

mymina
دوشنبه 25 دی 1391, 11:09 صبح
من xml کار نکردم میشه بگید چطوری باید این کلاس رو تعریف کنم نمونه کد یا مثال یا منبعی معرفی کنید

hamedAdmin
دوشنبه 25 دی 1391, 11:24 صبح
لازم هم نیست حتما xml باشه.
میتونی تو هر فرمتی که خواستی ذخیره کنی!فقط باید توی یه فایل جانبی روی دیسکت باشه.
و اما برای آشنایی با xml این عبارت رو تو گوگل سرچ کن:xml tutorial pdf
و فایلای راهنماشو بگیر
بعد از اینکه متوجه شدی xml چه موجود باحالیه(البته نه همیشه, باید مواظب استفاده ناصحیح ازش باشید) برو سراغ این آدرس
http://stackoverflow.com/questions/590881/how-do-i-write-an-xml-string-to-a-file
که نحوه ذخیره و بازیابیش رو از فایل بهت میده
نهایتا با کار کردن با کلاسهای XMLDocumen توی C#‎ میتونی به نحو احسن ازش استفاده کنی.

mymina
دوشنبه 25 دی 1391, 12:50 عصر
سلام ممنون از راهنمای تون لطف میکنید نمونه کد xml ان را بدهید

hamedAdmin
دوشنبه 25 دی 1391, 12:59 عصر
تمامی property هایی که میخای عوض بشه رو درنظر بگیر:مثلا color,Size,Font,Ancher,...
حالا ممکنه بعضی هاش مربوط به کنترلای خاص باشه ولی من پیشنهاد میکنم برای شروع به کار property های مشترک رو در نظر بگیر.مثلا من همین 4 تا property رو فرض میکنم:
<Property>
<Size>18</Size>
<Font>21</Font>
<Ancher>'fill'</Ancher>
<Color>'red'</Color>
</Property>

مواظب باش کدهای XML به کوچیکی و بزرگی حروف حساسند

hamedAdmin
سه شنبه 26 دی 1391, 08:30 صبح
سلام
من نمونه کامل شده رو میفرستم
ببین اون خطوطی رو که کامنت کردم یه بار و در جایی که میخوای برای بار اول فایلت ذخیره بشه اجرا کن.
و البته حتما به using ها هم توجه کن!چیزیشو از قلم نندازی
من اینو امتحان کردم:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{


//string strXml = "<Properties>";
// strXml+="<BackColor>121345</BackColor>";
// strXml+="<ForeColor>111111</ForeColor>";
// strXml+="<Height>35</Height>";
// strXml+= "<Font size='9' style='bold'>Tohama</Font>";
// strXml+="</Properties>";
//XDocument doc = XDocument.Parse(strXml);
//doc.Save("Configure.xml");
XDocument doc = XDocument.Load("Configure.xml");
string BColor=doc.Element("Properties").Element("BackColor").Value.ToString();
string FColor=doc.Element("Properties").Element("ForeColor").Value.ToString();
string Ht =doc.Element("Properties").Element("Height").Value.ToString();
string fontName = doc.Element("Properties").Element("Font").Value.ToString();
string fontSize = doc.Element("Properties").Element("Font").Attribute("size").Value.ToString();
string fontStyle = doc.Element("Properties").Element("Font").Attribute("style").Value.ToString();
FontStyle FStyle=new FontStyle();

switch (fontStyle)
{

case "regular":
FStyle = FontStyle.Regular;
break;
case "bold":
FStyle = FontStyle.Bold;
break;
case "italic":
FStyle = FontStyle.Italic;
break;
case "underline":
FStyle = FontStyle.Underline;
break;
default:
FStyle = FontStyle.Regular;
break;
}
label1.BackColor = ColorTranslator.FromOle(Int32.Parse(BColor));
label1.ForeColor = ColorTranslator.FromOle(Int32.Parse(FColor));
label1.Height = Int32.Parse(Ht);
label1.Font = new Font(fontName, float.Parse(fontSize), FStyle);
}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}


همونطورکه میبینی من انتصاب استایل واحد رو داخل رویداد کلیک یه دکمه گذاشتم و label1 با این کار استایل میگیره.
که شما حتما باید همین رو تعمیم بدی؛ چون ابتدای کار راحت متوجه بشی ساده واست نوشتم.
موفق باشی

mymina
سه شنبه 26 دی 1391, 10:16 صبح
سلام ممنون از زحماتتون
فایل Configure.xml
که باید load بشه چطور ایجاد کنم چه کدی نیاز داره بنویسم

hamedAdmin
سه شنبه 26 دی 1391, 10:51 صبح
دوست عزیز من که برات نوشتم همون که توی کامنت گذاشتم واسه تولیدش به کار رفته!
چشم دوباره میذارم؛ ایناها:


string strXml = "<Properties>";
strXml+="<BackColor>121345</BackColor>";
strXml+="<ForeColor>111111</ForeColor>";
strXml+="<Height>35</Height>";
strXml+= "<Font size='9' style='bold'>Tohama</Font>";
strXml+="</Properties>";
XDocument doc = XDocument.Parse(strXml);
doc.Save("Configure.xml");



ضمنا وقتی که ایجاد شد با notepad میتونی ویرایشش کنی بدون اینکه وارد برنامه بشی!
ولی کار اصولی اینه که توی دیتابیس بذاری یعنی توی یه جدولات یه ستون از نوع xml بذار و هر بار از همین فیلد بخون.
پیشنهاد میکنم با همین XDocument , XMLDocument بیشتر کار کنی.
بالاخره من اصل داستان رو واست گفتم.
موف باشی

RED-C0DE
سه شنبه 26 دی 1391, 10:57 صبح
شما می تونین کنترلهای سفارشی بسازین. یعنی مثلا یک textBox می سازین با رنگ قرمز،‌ بعد توی برنامه تو فرمهای مختلف می تونین همین textBox رو بجای textBox‌ اصلی بکشین بیارین روی فرمتون.

در واقع با ارث بری اینکارا رو می شه انجام داد خیلی هم ساده.
مثلا یک کلاس ایجاد کنید و کدهای زیر رو داخلش بنویسین:

public class MyRedTextBox : TextBox
{
public MyRedTextBox()
{
this.BackColor= Color.Red;
//...
}

//...
}

حالا برنامه رو کامپایل کنید. برین توی محیط دیزاین یک فرم. روی toolbox اگه دقت کنید (و مشکلی نباشه) کنترلی ب اسم MyRedTextBox ظاهر شده. اون رو می تونین ازش استفاده کنید

mymina
سه شنبه 26 دی 1391, 11:27 صبح
خیلی ممنون از زحماتتون گرفتم چیکار کنم درست شد:لبخند::تشویق:

samadblaj
سه شنبه 26 دی 1391, 11:28 صبح
سلام دوست عزیز hamedAdmin لطفا اگه میشه تو قالب سمپل بذارید.

hamedAdmin
سه شنبه 26 دی 1391, 11:44 صبح
وای وای نکنی این کارو!
اصلا بحثو بردی به یه سمت دیگه!!
دوست عزیز فکر میکنم تو برنامه نویسی بهترین کار, کار اصولیه ازپایه؛ پس بیایید با هم اصولی باشیم.
روشی که به نظر من درست اومده و ذکر کردم همیشه و در همه حال و با هر نوع زبان و دیتا بیسی کار میده و البته مو به مو همون قواعد تجرد که مد نظر نویسنده های dot net بوده رو برآورده میکنه.
اینجوری همیشه و هروقت دلتون یه تم جدید خواست میتونید بدون این که دست به سورس بزنید به یه سری از کنترلاتون اون تم رو بدید.
البته پیشنهاد من یه کلاس جدا برای طراحی تم هستش.
این روش بدون هزینه نگهداری نرم افزار بهتون کار میده یعنی کاربر میتونه خودش واسه خودش تم درست کنه.
یه کم وسیع تر بهش نگاه کنیم میشه همون تم های ویندوز که طراحی میکنی, ذخیره میکنی و ازشون استفاده میکنی!
موفق و موید باشی


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

در واقع با ارث بری اینکارا رو می شه انجام داد خیلی هم ساده.
مثلا یک کلاس ایجاد کنید و کدهای زیر رو داخلش بنویسین:

public class MyRedTextBox : TextBox
{
public MyRedTextBox()
{
this.BackColor= Color.Red;
//...
}

//...
}

حالا برنامه رو کامپایل کنید. برین توی محیط دیزاین یک فرم. روی toolbox اگه دقت کنید (و مشکلی نباشه) کنترلی ب اسم MyRedTextBox ظاهر شده. اون رو می تونین ازش استفاده کنید

hamedAdmin
سه شنبه 26 دی 1391, 11:48 صبح
سلام
جانم چی رو تو قالب سمپل بذارم؟
از اون اول تاپیک رو پیگیری کنه همه چیز واضحه ها!


سلام دوست عزیز hamedAdmin لطفا اگه میشه تو قالب سمپل بذارید.

RED-C0DE
سه شنبه 26 دی 1391, 19:41 عصر
وای وای نکنی این کارو!
اصلا بحثو بردی به یه سمت دیگه!!
دوست عزیز فکر میکنم تو برنامه نویسی بهترین کار, کار اصولیه ازپایه؛ پس بیایید با هم اصولی باشیم.
روشی که به نظر من درست اومده و ذکر کردم همیشه و در همه حال و با هر نوع زبان و دیتا بیسی کار میده و البته مو به مو همون قواعد تجرد که مد نظر نویسنده های dot net بوده رو برآورده میکنه.
اینجوری همیشه و هروقت دلتون یه تم جدید خواست میتونید بدون این که دست به سورس بزنید به یه سری از کنترلاتون اون تم رو بدید.
البته پیشنهاد من یه کلاس جدا برای طراحی تم هستش.
این روش بدون هزینه نگهداری نرم افزار بهتون کار میده یعنی کاربر میتونه خودش واسه خودش تم درست کنه.
یه کم وسیع تر بهش نگاه کنیم میشه همون تم های ویندوز که طراحی میکنی, ذخیره میکنی و ازشون استفاده میکنی!
موفق و موید باشی

هرجور صلاح می دونین شما همون کارو بکن ولی راه استانداردش اینه ..اینم ک گفتی راهیه در نوع خودش! ;)

hamedAdmin
چهارشنبه 27 دی 1391, 07:40 صبح
سلام
من همون اول هم عرض کردم که روش بنده تنها راه استاندارد نیست بلکه یکی از راه هاست.
اما روشی که شما مطرح کردید اصلا مبانی شیئ گرایی و سهولت مرحله نگهداری رو در نظر نمیگیره!
مثلا فرض کنید شما یه برنامه رو به همون روش ساختید و یک TextBox با رنگ قرمز درست کردید و توی تمام فرمهاتون استفاده کردید ولی بعد که نرم افزار رو دادید دست مشتری خواست رنگ اون رو سبز بذاری شما مجبوری دوباره بیای و کدتو دست کاری کنی و رنگ قرمز رو بذاری سبز!که البته کار درستی نیست؛ ولی اون طور که من گفتم کافیه یه فرم و کلاس دیگه برای طراحی تم های دلخواه مشتری در اختیارش قرار بدی تا هرجور میخواد تنظیماتش رو انجام بده و درنهایت همین تنظیمات روی دیسک ذخیره بشه(مثلا تو موردی که من آوردم تو همون فایل xml ذخیره میشه) و کلاس تنظیم کننده که کدش رو بالا زدم صدازده میشه!به همین راحتی برنامه شما هر بار که اجرا میشه تنظیماتش رو از فایل جانبی میگیره!
و اما مسئله ی وراثت رو میشه درنظر گرفت بطوری که واسه کنترلها یک کنترل مادر فرض کنیم تا با تنظیم property های اون همه child هاش هم خصوصیات مورد نظر رو بگیرن؛ که البته این هم درصورتیه که دیگه نخوایم واسه هیچکدوم از کنترل های فرزند استثناء قائل بشیم.
ضمنا خوشحال میشم اگه اشتباه میکنم راهنمایی بشم چون تعصب تو برنامه نویسی جایی نداره(البته اکثر برنامه نویسها متاسفانه روی روش خودشون متعصبن!)
ممنون.

هرجور صلاح می دونین شما همون کارو بکن ولی راه استانداردش اینه ..اینم ک گفتی راهیه در نوع خودش! ;)

mymina
چهارشنبه 27 دی 1391, 10:43 صبح
سلام کاربر عزیزhamedAdmin طبق روشی که شما گفتید من یک فایل xml ایجاد کرد با نمونه کد های که شما قرار داده بودید



<?xml version="1.0" encoding="utf-8"?>
<Properties>
<ForeColor>000060</ForeColor>
<Height>35</Height>
<Font size="11" style="bold">B Nazanin</Font>
<FontTextbox size="9" > Arial</FontTextbox>
<ForeColorText >003366</ForeColorText>
</Properties>

و کلاسی در برنامه ایجاد کنم که کد آنرا در زیر قرار دادهام

class ClsXMLfile
{

public string FColor
{ get; set; }

public string Ht
{ get; set; }

public string fontName
{ get; set; }

public string fontSize
{ get; set; }
public string fontStyle
{ get; set; }



public void XmlFile()
{



XDocument doc = XDocument.Load("Configure.xml");

// string BColor=doc.Element("Properties").Element("BackColor").Value.ToString();
FColor = doc.Element("Properties").Element("ForeColor").Value.ToString();
Ht = doc.Element("Properties").Element("Height").Value.ToString();
fontName = doc.Element("Properties").Element("Font").Value.ToString();
fontSize = doc.Element("Properties").Element("Font").Attribute("size").Value.ToString();
fontStyle = doc.Element("Properties").Element("Font").Attribute("style").Value.ToString();
/* FontStyle FStyle = new FontStyle();

switch (fontStyle)
{

case "regular":
FStyle = FontStyle.Regular;
break;
case "bold":
FStyle = FontStyle.Bold;
break;
case "italic":
FStyle = FontStyle.Italic;
break;
case "underline":
FStyle = FontStyle.Underline;
break;
default:
FStyle = FontStyle.Regular;
break;
}
*/
}



}



و کدی که در صفحه فرم ایجاد کردم به این صورت بود

public void show()
{

OjClsXml.XmlFile();
label1.ForeColor = ColorTranslator.FromOle(Int32.Parse(OjClsXml.FColo r));
label1.Height = Int32.Parse(OjClsXml.Ht);
label1.Font = new Font(OjClsXml.fontName, float.Parse(OjClsXml.fontSize));
label9.ForeColor = ColorTranslator.FromOle(Int32.Parse(OjClsXml.FColo r));
label9.Font = new Font(OjClsXml.fontName, float.Parse(OjClsXml.fontSize));
}

در این روش که طبق راهنمایی شما انجام دادم درست است

mymina
چهارشنبه 27 دی 1391, 10:48 صبح
در این روش در هر صفحه فرم برای تغییر فرمت label باید در هر صفحه فرم کد های زیر نوشته شود طبق مطالبی که فرمودید
واسه کنترلها یک کنترل مادر فرض کنیم تا با تنظیم property های اون همه child هاش هم خصوصیات مورد نظر رو بگیرن می شود این روش را خلاصه تر کرد و یا برای هر صفحه فرم و هر فرمت بندی کنترل باید کد های زیر را نوشت


OjClsXml.XmlFile();
label1.ForeColor = ColorTranslator.FromOle(Int32.Parse(OjClsXml.FColo r));
label1.Height = Int32.Parse(OjClsXml.Ht);
label1.Font = new Font(OjClsXml.fontName, float.Parse(OjClsXml.fontSize));
label9.ForeColor = ColorTranslator.FromOle(Int32.Parse(OjClsXml.FColo r));
label9.Font = new Font(OjClsXml.fontName, float.Parse(OjClsXml.fontSize

RED-C0DE
چهارشنبه 27 دی 1391, 11:18 صبح
سلام
من همون اول هم عرض کردم که روش بنده تنها راه استاندارد نیست بلکه یکی از راه هاست.
اما روشی که شما مطرح کردید اصلا مبانی شیئ گرایی و سهولت مرحله نگهداری رو در نظر نمیگیره!
مثلا فرض کنید شما یه برنامه رو به همون روش ساختید و یک TextBox با رنگ قرمز درست کردید و توی تمام فرمهاتون استفاده کردید ولی بعد که نرم افزار رو دادید دست مشتری خواست رنگ اون رو سبز بذاری شما مجبوری دوباره بیای و کدتو دست کاری کنی و رنگ قرمز رو بذاری سبز!که البته کار درستی نیست؛ ولی اون طور که من گفتم کافیه یه فرم و کلاس دیگه برای طراحی تم های دلخواه مشتری در اختیارش قرار بدی تا هرجور میخواد تنظیماتش رو انجام بده و درنهایت همین تنظیمات روی دیسک ذخیره بشه(مثلا تو موردی که من آوردم تو همون فایل xml ذخیره میشه) و کلاس تنظیم کننده که کدش رو بالا زدم صدازده میشه!به همین راحتی برنامه شما هر بار که اجرا میشه تنظیماتش رو از فایل جانبی میگیره!
و اما مسئله ی وراثت رو میشه درنظر گرفت بطوری که واسه کنترلها یک کنترل مادر فرض کنیم تا با تنظیم property های اون همه child هاش هم خصوصیات مورد نظر رو بگیرن؛ که البته این هم درصورتیه که دیگه نخوایم واسه هیچکدوم از کنترل های فرزند استثناء قائل بشیم.
ضمنا خوشحال میشم اگه اشتباه میکنم راهنمایی بشم چون تعصب تو برنامه نویسی جایی نداره(البته اکثر برنامه نویسها متاسفانه روی روش خودشون متعصبن!)
ممنون.

اتفاقا روشی ک حالا مثلا "من" گفتم در واقع روشی استاندارده ک داره استفاده می شه و همه نیازها رو براورده می کنه!
نمی دونم اینکه می گین برای هر تغییر نیازه ک کد رو دوباره دست کاری کنیم رو از کجا می گین!!!!!!:-؟
تعجبمه شما ک اینقدر برنامه نویس خبره ای هستی همچین حرفی می زنی!
این روش اصل ارث بریه. شما با ارث بری و استفاده از Setting ها ب چیزی ک می خواین تو این سناریو می رسی.
من base کار رو گفتم تا کسی اگه تشخیص داد به دردش می خوره بره دنبالش و خودش بقیشو در بیاره! مثالی ک گفتین یکی از مسائل روزمره در این قضیه هست و اصلا چیز عجیبی نیست. برای پیاده سازیش هم، شما راه های مختلف هست. می تونین از UserSetting ها استفاده کنید. تصور کنید ک فرمی دارید و کاربر تغییرات مورد نظرشو در استایل برنامه اونجا می ده. مثلا:

textBox BackColors
FormsBackColor
FontStyles
...

البته ناگفته نماند روش شما هم روش زیباییه دوست عزیز همونطور ک عرض کردم

و این تنظیمات توی فرم ، ذخیره می شن در Setting مربوط ب برنامه. در فرم اصلی (اگه فرض کنیم یک فرم پایه برای تمام فرمها داریم) و کنترل BaseTextBox ما مقادیر رو جایگزین می کنیم . ب همین راحتی. حالا هرکی بررسی می کنه و راه خودشو انتخاب می کنه برای پیاده سازی و این داستانا.

hamedAdmin
چهارشنبه 27 دی 1391, 11:27 صبح
سلام
منظورم از درنظر گرفتن کنترل پدر و ارث بری اینه که شما مثلا یه پنل درنظر بگیری برای فرم خودت و بعد label ها, TextBox ها و هرچیزی که میخوای مثل این کنترل property بگیرن رو داخلش بذاری و بعد همون property مورد نظرشون رو Inehrit بذاری!
با این کار فقط لازمه که property همین پنل رو از کلاس ClsXMLfile بگیری!یعنی به جای اینکه مثلا 20 تا لیبل و textbox و ... فقط یه پنل رو تنظیم کردی!
با این کار تازه دریچه ای به یه دنیای دیگه واست باز میشه, به این شکل که میتونی چند تا پنل بذاری و هر پنل و کنتل های داخلش یه تنظیمات خاص بگیره!جالبه


در این روش در هر صفحه فرم برای تغییر فرمت label باید در هر صفحه فرم کد های زیر نوشته شود طبق مطالبی که فرمودید
واسه کنترلها یک کنترل مادر فرض کنیم تا با تنظیم property های اون همه child هاش هم خصوصیات مورد نظر رو بگیرن می شود این روش را خلاصه تر کرد و یا برای هر صفحه فرم و هر فرمت بندی کنترل باید کد های زیر را نوشت


OjClsXml.XmlFile();
label1.ForeColor = ColorTranslator.FromOle(Int32.Parse(OjClsXml.FColo r));
label1.Height = Int32.Parse(OjClsXml.Ht);
label1.Font = new Font(OjClsXml.fontName, float.Parse(OjClsXml.fontSize));
label9.ForeColor = ColorTranslator.FromOle(Int32.Parse(OjClsXml.FColo r));
label9.Font = new Font(OjClsXml.fontName, float.Parse(OjClsXml.fontSize

AmirGhasemi
چهارشنبه 27 دی 1391, 12:38 عصر
سلام
ببخشيد وسط دعوا يهو پيدام شده ولي اگر به نظر من بخواهيد شما بايد يك UserControl بسازيد و اونجا تم هاتون را بدهيد و بعد بجاي كنترل اصلي از كنترل خودتون استفاده كنيد
اما راه دوست عزيزمون كه استفاده از XML را پيشنهاد دادن راه خوبيه منتهي به شرط اينكه با USerControl تركيب شه!! اينجوري نيازي به كامپايل مججد پروژه هم نيست

mymina
چهارشنبه 27 دی 1391, 12:40 عصر
دوست عزیز RED-CODE


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

در واقع با ارث بری اینکارا رو می شه انجام داد خیلی هم ساده.
مثلا یک کلاس ایجاد کنید و کدهای زیر رو داخلش بنویسین:


public class MyRedTextBox : TextBox
{
public MyRedTextBox()
{
this.BackColor= Color.Red;
//...
}

//...
}



حالا برنامه رو کامپایل کنید. برین توی محیط دیزاین یک فرم. روی toolbox اگه دقت کنید (و مشکلی نباشه) کنترلی ب اسم MyRedTextBox ظاهر شده. اون رو می تونین ازش استفاده کنید
من متوجه راه حل شما نشدم آیا طبق روش شما می توانم امکانی به نرم افزارم اضافه کنم که کاربر برنامه بتواند رنگ background رنگ متن فونت متن را طبق سلیق خود انتخاب نماید.
اگر می شود راحتان را کمی توضیح دهید متوجه نشدم

mymina
چهارشنبه 27 دی 1391, 12:47 عصر
دوستان من مبتدی هستم این روش usercontrol که میگید چه طوریه طبق روش شما می توانم امکانی به نرم افزارم اضافه کنم که کاربر برنامه بتواند رنگ background رنگ متن فونت متن را طبق سلیق خود انتخاب نمایدو با تغییرات ان فون تمامی صفحاتم تغییر نماید

hamedAdmin
پنج شنبه 28 دی 1391, 08:09 صبح
بازم میگم من تاکید نکردم روشم بهترینه!این روشی که گفتم رو تو پروژه های بزرگ دیدم و متوجه خوب کار کردنش شدم.
ولی روشی هم که شما میگی با این توضیحاتی که بصورت تکمیلی نوشتی تقریبا به اون اصلی که من گفتم نزدیک شد، یعنی اصل داستان اینه که تم ها از جایی برداشته بشن و برای کنترل پدر استفاده بشن و تمام child ها هم همون استایل رو اتوماتیک بگیرن, بهتر بگیم به ارث ببرن.
ما دنبال راه بهینه ایم ولی اگه توضیحاتت رو بصورت عملی نشون میدادی میشد بیشتر راجع بهش صحبت کرد.

همون طوری که من اصل کد ها رو نوشتم و مثال عملی زدم ترجیح میدم منتظر خوندن کدهایی که شما دوست عزیز برای یه مثال میزنید بمونم.
موفق باشید.

اتفاقا روشی ک حالا مثلا "من" گفتم در واقع روشی استاندارده ک داره استفاده می شه و همه نیازها رو براورده می کنه!
نمی دونم اینکه می گین برای هر تغییر نیازه ک کد رو دوباره دست کاری کنیم رو از کجا می گین!!!!!!:-؟
تعجبمه شما ک اینقدر برنامه نویس خبره ای هستی همچین حرفی می زنی!
این روش اصل ارث بریه. شما با ارث بری و استفاده از Setting ها ب چیزی ک می خواین تو این سناریو می رسی.
من base کار رو گفتم تا کسی اگه تشخیص داد به دردش می خوره بره دنبالش و خودش بقیشو در بیاره! مثالی ک گفتین یکی از مسائل روزمره در این قضیه هست و اصلا چیز عجیبی نیست. برای پیاده سازیش هم، شما راه های مختلف هست. می تونین از UserSetting ها استفاده کنید. تصور کنید ک فرمی دارید و کاربر تغییرات مورد نظرشو در استایل برنامه اونجا می ده. مثلا:

textBox BackColors
FormsBackColor
FontStyles
...

البته ناگفته نماند روش شما هم روش زیباییه دوست عزیز همونطور ک عرض کردم

و این تنظیمات توی فرم ، ذخیره می شن در Setting مربوط ب برنامه. در فرم اصلی (اگه فرض کنیم یک فرم پایه برای تمام فرمها داریم) و کنترل BaseTextBox ما مقادیر رو جایگزین می کنیم . ب همین راحتی. حالا هرکی بررسی می کنه و راه خودشو انتخاب می کنه برای پیاده سازی و این داستانا.

hamedAdmin
پنج شنبه 28 دی 1391, 12:10 عصر
سلام
دقیقا همین طوره؛ترکیب UserControl, WPF و این روش و البته استفاده از دیتا بیس واسه استایل دادن به UserControl یه چیز جالب ایجاد میکنه.مثل منوهای دکمه ای کشویی که با گرادیانت و تغییر سایز اتوماتیک فوق العادس



اما راه دوست عزيزمون كه استفاده از XML را پيشنهاد دادن راه خوبيه منتهي به شرط اينكه با USerControl تركيب شه!! اينجوري نيازي به كامپايل مججد پروژه هم نيست

mze666
پنج شنبه 28 دی 1391, 12:52 عصر
من خیلی وارد بحث نمیشم چون دیگه winForm کار نمی کنم ولی ذخیره کردن تم توی دیتابیس واقعاً روش عجیب و غلطی هستش که از دوستان شنیدیم و نمیدونم این روش رو کجا دیدن که استفاده شده؟!
تمام این کارا توی WPF در یک ResourceDictionary قرار میگیره و به تمامی قسمت های برنامه اعمال میشه.