2008-10-29 14 views
11

हम वर्तमान में एक बड़े डब्ल्यूपीएफ लोब एप्लिकेशन की योजना बना रहे हैं और मुझे आश्चर्य है कि दूसरों को लगता है कि यूआई सेटिंग्स के बहुत सारे स्टोर करने के लिए सबसे अच्छा अभ्यास क्या है।यूआई सेटिंग्स को स्टोर करने के लिए सर्वोत्तम अभ्यास?

  • Expander स्टेट्स
  • मेनू आदेश
  • आकार गुण
  • आदि ...

मैं वितरित SettingsProvider का उपयोग करके संग्रहीत मूल्यों के दर्जनों होने के विचार पसंद नहीं है (यानी App.config फ़ाइल) हालांकि इसका उपयोग कस्टम सेटिंग्सप्रोवाइडर का उपयोग करके एम्बेडेड डेटाबेस में स्टोर करने के लिए किया जा सकता है। कुछ प्रकार के डाटाबेसिंग का उपयोग करने में सक्षम होने पर भी चिंता का विषय है। क्या किसी को भी यही समस्या है?

आपने यूई उपयोगकर्ता सेटिंग्स को स्टोर करने के लिए क्या किया?

उत्तर

1

किसी कारण से लोकप्रियता खोने लगता है; लेकिन रजिस्ट्री हमेशा इस तरह की सेटिंग्स के लिए एक उपयुक्त जगह रही है। xml "प्राथमिकताएं" फ़ाइल के रूप में

Environment.SpecialFolder.ApplicationData 

स्टोर यह तो यह इतना करने के लिए मिलता है और अगर यह कभी दूषित हो जाता है परिवर्तित करने के लिए मुश्किल नहीं है:

+1

रजिस्ट्री बिल्कुल नहीं सही जगह अब है। पंजीकरण दूषित हो जाते हैं, अनुचित उपयोग सुरक्षा मुद्दों का कारण बन सकता है, और संभावित रूप से LUA/UAC सिद्धांतों का उल्लंघन कर सकता है। http://secureapps.blogspot.com/2006/10/windows-registry-plication-security.html –

+0

ठीक है, यूआई सेटिंग्स शायद ही कभी सुरक्षा प्रासंगिक हैं, है ना? – Treb

+0

वे आसानी से भ्रष्ट हैं और त्रुटियों के लिए प्रवण हैं। मैं उन्हें आम उपयोगकर्ताओं द्वारा आसानी से सुलभ कर दूंगा। – thismat

13

हम प्राथमिकताओं को यहां दायर की दुकान।

अभी तक इसने हमारे लिए रजिस्ट्री से काफी बेहतर काम किया है, अगर कुछ भी दूषित हो जाता है या रीसेट होने की आवश्यकता होती है तो यह साफ और आसान है।

2

हम सभी Isolation Storage में स्टोर करते हैं (हम क्लिकऑन के साथ चल रहे हैं)। हमारे पास कुछ वस्तु है जिसे हम serialize (XmlSerializer)।

1

हम ऐप के डेटाबेस में किसी तालिका में कॉन्फ़िगरेशन जानकारी संग्रहीत करने के लिए कस्टम सेटिंग्स प्रदाता का उपयोग करते हैं। यदि आप पहले ही डेटाबेस का उपयोग कर रहे हैं तो यह एक अच्छा समाधान है।

1

प्रोग्रामिंग क्रिस सेल्स & इयान ग्रीफिथ द्वारा WPF में यह कहते हैं

WPF आवेदन के लिए पसंदीदा सेटिंग तंत्र नेट और वी.एस. द्वारा प्रदान की एक है: निर्मित साथ System.Configuration नाम स्थान से ApplicationSettingBase वर्ग डिजाइनर में।

+0

दुर्भाग्यवश सेटिंग डिज़ाइनर (बनाम 2008 में) डिज़ाइनर में सेट की गई किसी भी सेटिंग को डिज़ाइन में डिलीटसेटिंगवैल्यूएट्रिब्यूट प्रविष्टियों के रूप में सेट करता है। डिज़ाइनर.वीबी। ऐसा करने का कोई तरीका नहीं है। यदि आप हाथ से कॉन्फ़िगरेशन फ़ाइल संपादित करते हैं, तो अगली बार जब आप सेटिंग डिज़ाइनर में संपादित करेंगे तो यह पुन: संक्रमित होगा। यह इतना बुरा है। इसके परिणामस्वरूप हार्डकोडेड डिफ़ॉल्ट (जो कुछ हद तक छिपे हुए हैं) के साथ एक अनुप्रयोग तैनात किया जा सकता है, यदि ऐप.कॉन्फिग सेटिंग्स अनुपलब्ध हैं तो यह कार्रवाई करेगा। http://tinyurl.com/3xyzz66 – Topdown

10

UI सेटिंग्स को स्टोर करने का तेज़ तरीका Properties.Settings.Default सिस्टम का उपयोग कर रहा है। मूल्य के साथ बाध्यकारी WPF का उपयोग करना इसके साथ क्या अच्छा हो सकता है। Example here। Settins स्वचालित रूप से अद्यतन और लोड कर रहे हैं।

<Window ... 
    xmlns:p="clr-namespace:UserSettings.Properties" 
    Height="{Binding Source={x:Static p:Settings.Default}, Path=Height, Mode=TwoWay}" 
    Width="{Binding Source={x:Static p:Settings.Default}, Path=Width, Mode=TwoWay}" 
    Left="{Binding Source={x:Static p:Settings.Default}, Path=Left, Mode=TwoWay}" 
    Top="{Binding Source={x:Static p:Settings.Default}, Path=Top, Mode=TwoWay}"> 

... 
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    Settings.Default.Save(); 
    base.OnClosing(e); 
} 

समस्या यह है कि यदि आपका आवेदन बड़ा है तो यह जल्दी ही गड़बड़ हो जाता है।

एक और समाधान (यहां किसी द्वारा प्रस्तावित) एक्सएमएल में अपनी प्राथमिकताओं को स्टोर करने के लिए एप्लीकेशनडाटा पथ का उपयोग करना है। वहां आप अपनी खुद की सेटिंग क्लास बना सकते हैं और इसे जारी रखने के लिए एक्सएमएल सीरिएलाइज़र का उपयोग कर सकते हैं। यह दृष्टिकोण आपको संस्करणों से संस्करणों में माइग्रेशन करने में सक्षम बनाता है। अधिक शक्तिशाली होने के दौरान, इस विधि को थोड़ा और कोड चाहिए।

4

आंगन के जवाब में खोदना और इसे डीकास्टेलजौ के उत्तर और ब्लॉग पोस्ट के साथ संयोजित करना, यहां एक उदाहरण दिया गया है जो कुछ अंतराल में भरता है जो मुझे स्पष्ट नहीं थे।

XAML फाइल:

<Window ... 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:p="clr-namespace:MyApp" 
    Height="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndHeight, Mode=TwoWay}" 
    Width="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndWidth, Mode=TwoWay}" 
    Left="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndLeft, Mode=TwoWay}" 
    Top="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndTop, Mode=TwoWay}" 
    ... 

और स्रोत फ़ाइल:

namespace MyApp 
{ 
    class MainWindow .... 
    { 
     ... 

     protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
     { 
      MyAppSettings.Default.Save(); 
      base.OnClosing(e); 
     } 
    } 

    public sealed class MyAppSettings : System.Configuration.ApplicationSettingsBase 
    { 
     private static MyAppSettings defaultInstance = ((MyAppSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new MyAppSettings()))); 
     public static MyAppSettings Default 
     { 
      get { return defaultInstance; } 
     } 

     [System.Configuration.UserScopedSettingAttribute()] 
     [System.Configuration.DefaultSettingValueAttribute("540")] 
     public int MainWndHeight 
     { 
      get { return (int)this["MainWndHeight"]; } 
      set { this["MainWndHeight"] = value; } 
     } 

     [System.Configuration.UserScopedSettingAttribute()] 
     [System.Configuration.DefaultSettingValueAttribute("790")] 
     public int MainWndWidth 
     { 
      get { return (int)this["MainWndWidth"]; } 
      set { this["MainWndWidth"] = value; } 
     } 

     [System.Configuration.UserScopedSettingAttribute()] 
     [System.Configuration.DefaultSettingValueAttribute("300")] 
     public int MainWndTop 
     { 
      get { return (int)this["MainWndTop"]; } 
      set { this["MainWndTop"] = value; } 
     } 

     [System.Configuration.UserScopedSettingAttribute()] 
     [System.Configuration.DefaultSettingValueAttribute("300")] 
     public int MainWndLeft 
     { 
      get { return (int)this["MainWndLeft"]; } 
      set { this["MainWndLeft"] = value; } 
     } 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे