PDA

View Full Version : ذخیره تغییرات در برنامه های WPF



m.bibjan
دوشنبه 29 خرداد 1391, 10:01 صبح
سلام من یه برنامه دارم که مثلا دوتا فرم داره.کاربر میادش توی فرم 1، تنظیمات صدا و تم رو انجام میده و میره توی فرم 2 .
حالا من میخوام وقتی کاربر دوباره برگشت توی فرم 1، همون تم و صدای باشه که خودش قبلا انتخاب کرده بوده.البته تنظیم صدا هم هستش.
بواسطه دستور شرطی که توی اگه اشتباه نکنم، loading Form باید نوشته بشه ، یه سری چیزها توی ذهنم هستش ولی کامل کدش رو نمیدونم.
میخواستم ببینم کسی بلده کدش چیه؟
البته کارمم گیر این هستش.عجله ای هستش.ممنون

مهدی فرزاد
دوشنبه 29 خرداد 1391, 10:52 صبح
سلام
شما باید این اطلاعات رو درون یک کلاس جدا گانه ذخیره کنید و بعد کنترل هاتون رو به پراپرتی های دورن اون کلاس Bind کنید یا از اون بخونید یعنی یک کلاس داری که شامل یک سری خصوصیت مثل رنگ زمینه میزان صدا و .... هست اطلاعات باید در اون کلاس ذخیره بشه
لینک زیر در ساختن این گونه کلاس ها کمکت میکنه
http://barnamenevis.org/showthread.php?346114-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A7%DB%8C-%D8%A7%D8%B2-%D8%AF%D8%B1%D9%88%D9%86-%D9%BE%D9%86%D8%AC%D8%B1%D9%87-%D9%87%D8%A7%DB%8C-%D9%85%D8%AE%D8%AA%D9%84%D9%81

m.bibjan
دوشنبه 29 خرداد 1391, 16:43 عصر
سلام
یعنی کد رو باید به این صورت تغییر بدم؟
class ParameterThemes : INotifyPropertyChanged
{
#region Fields (2)
private string _Theme1;
private string _Theme2;
private string _Theme3;

///////////////////
#endregion Fields
#region Properties (2)

public string THeme1
{
get { return _THeme1; }
set
{
if (_THeme1 == value) return;
_THeme1 = value;
raisePropertyChanged("THeme1");
}
}

public string THeme2
{
get { return _THeme2; }
set
{
if (_THeme2 == value) return;
_THeme2 = value;
raisePropertyChanged("THeme2");
}

public string THeme3
{
get { return _THeme3; }
set
{
if (_THeme3 == value) return;
_THeme3 = value;
raisePropertyChanged("THeme3");
}

}

#endregion Properties

#region INotifyPropertyChanged Members
/// <summary>
/// PropertyChanged notification.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
void raisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler == null) return;
handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}




و کلاس دوم هم باید به این نحو باشه ؟

class ParameterClass
{
private static ParameterFilds _parameter = new ParameterThemes();
public static ParameterFilds Parameters { get { return _parameter; } set { _parameter = value; } }
}




فقط نمیدونم واسه بایند تم ها چه کد رو بنویسم.
ممنون از توجهتون.

مهدی فرزاد
سه شنبه 30 خرداد 1391, 00:39 صبح
اگر منظور شما از Them همون Style کد به شکل زیر میشه

#region Fields (1)
private Style _Theme1;


///////////////////
#endregion Fields
#region Properties (1)

public Style Theme1
{
get { return _Theme1; }
set
{
if (_Theme1 == value) return;
_Theme1 = value;
raisePropertyChanged("Theme1");
}
}



#endregion Properties

#region INotifyPropertyChanged Members
/// <summary>
/// PropertyChanged notification.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
void raisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler == null) return;
handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}




class ParameterClass
{
private static ParameterThemes _parameter = new ParameterThemes();
public static ParameterThemes Parameters { get { return _parameter; } set { _parameter = value; } }
}


و برای Bind کردن کد زیر

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestStyle" x:Class="TestStyle.Window1"
Title="Window1" Height="300" Width="300" Style="{Binding Parameters.Theme1}" AllowsTransparency="True" WindowStyle="None">
<Window.DataContext>
<local:ParameterClass/>
</Window.DataContext>


مثال زیر رو ببین
پنجره دوم رو باز کن و یکی از استایل ها رو انتخاب کن بعد پنجره دوم رو ببند و دوباره باز کن

نکته : اگر میخوای حتی بعد از بستن برنامه استایل باقی بمونه باید در Setting برنامه یک متغییر String بسازی و و هر بار که استایل رو عوض میکنی نام اون رو درون متغییر قرار بدی و بعد از باز شدن برنامه اون نام رو برای استایل فراخونی کنی
من این مورد رو هم برای شما انجام دادم
یعنی با بستن کامل برنامه و باز شدن مجدد اون استایل پنجره دوم هم چنان باقی می ماند

m.bibjan
سه شنبه 30 خرداد 1391, 00:52 صبح
سلام هر چند زدن دکمه تشکر جزء قوانینه ولی خیلی حیف بود تشکر نکنم
خیلی ممنون.
فقط بگم که منظورم از Them همون گرافیکی که خودم واسه فرم درست میکنم هستش.که شامل عکس میشه و صدا.
عکس و صدا رو که به عنوان تم درست کردم ،به نظرتون مثل همون Style باهاش برخورد باید بشه؟

مهدی فرزاد
سه شنبه 30 خرداد 1391, 07:53 صبح
من چون برنامه شما رو ندیدم نمیدونم چکار کردید
ولی هر چیزی به کنترل و خاصیت مخصوص خودش باید Bind بشه
این یک سر نخ بوددیگه ما بقیش با خودتون بکه با برنامه و خواسته هاتون سازگارش کند

m.bibjan
سه شنبه 30 خرداد 1391, 10:09 صبح
سلام ممنون از توجهتون ولی شرمنده ازینکه من نمیدونم چطوری تمم رو که شامل عکس و صدا هستش رو به عنوان پارامتر به نرم افزار بشناسونم و بعد هر جا خواستم بایندش کنم؟
اگه منظورم رو نتونستم برسونم بگین تا نمونش رو بذارم؟

مهدی فرزاد
سه شنبه 30 خرداد 1391, 11:04 صبح
سلام
شما عکس رو کجا نمایش میدی؟ مگه کنترل Image نگذاشتید؟
پس یک خاصیت از نوع ImageSource ایجاد میکنی و خاصیت Source کنترل Image رو بهش bind میکنی

private ImageSource _image;


public ImageSource ImageProperty
{
get { return _image; }
set
{
if (_image == value) return;
_image = value;
raisePropertyChanged("ImageProperty");
}
}



<Image x:Name="image" Source="{Binding Parameters.ImageProperty}"/>


نکته : توی کد پست قبل برای ویندوز دیتا کانتکس رو معرفی کرده بودیم و کنترل Image که زیر مجموعه ویندوز هست اونو میشناسه در غیر اینصورت باید برای Image هم معرفی بشه

حالا میتونی هر جا میخوای این جوری آدرس بدی


BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri("C:\\Image1.jpg");
bi.EndInit();
ParameterClass.Parameters.ImageProperty = bi;


و یا آدرس رو توی Setting ذخیره کنی

Properties.Settings.Default.ImageSource = "C:\\Image1.jpg";
Properties.Settings.Default.Save();

و به این شکل از Setting بخونی


BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri( Properties.Settings.Default.ImageSource);
bi.EndInit();
ParameterClass.Parameters.ImageProperty = bi;

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

m.bibjan
جمعه 02 تیر 1391, 01:39 صبح
سلام
میخواستم ببینم واسه ذخبره تغییرات توی Page ها از همین کد بالا میشه استفاده کرد؟