2008-10-29 7 views
11

chúng tôi hiện đang lên kế hoạch cho ứng dụng WPF lớn hơn và tôi tự hỏi những gì người khác nghĩ là phương pháp hay nhất để lưu trữ nhiều cài đặt giao diện người dùng, ví dụ:Các phương pháp hay nhất để lưu trữ cài đặt giao diện người dùng?

  • Expander Hoa
  • menu lệnh
  • Sizing Thuộc tính
  • vv ...

tôi không thích ý tưởng của việc có hàng chục các giá trị được lưu trữ bằng cách sử dụng SettingsProvider giao (ví dụ: File App.config) mặc dù nó có thể được sử dụng để lưu trữ nó trong một cơ sở dữ liệu nhúng bằng cách sử dụng một SettingsProvider tùy chỉnh. có thể sử dụng một số loại databinding cũng là một mối quan tâm. Có ai có cùng vấn đề không?

Bạn đã làm gì để lưu trữ nhiều cài đặt người dùng ui?

Trả lời

1

Dường như mất tính phổ biến vì một số lý do; nhưng đăng ký luôn là nơi thích hợp cho các loại cài đặt này.

+1

Việc đăng ký là hoàn toàn không đúng chỗ nữa. Đăng ký bị hỏng, sử dụng không phù hợp có thể dẫn đến các vấn đề bảo mật và có khả năng vi phạm nguyên tắc LUA/UAC. http://secureapps.blogspot.com/2006/10/windows-registry-application-security.html –

+0

Vâng, các cài đặt giao diện người dùng khó có liên quan đến bảo mật, đúng không? – Treb

+0

Chúng dễ bị hỏng và dễ bị lỗi. Tôi muốn họ dễ dàng truy cập bởi những người dùng thông thường. – thismat

13

Chúng tôi lưu trữ các ưu đãi nộp ở đây:

Environment.SpecialFolder.ApplicationData 

cửa hàng nó như xml "sở thích" tập tin do đó, nó không quá khó để tìm và thay đổi nếu nó bao giờ bị hỏng.

Cho đến nay điều này đã làm việc tốt hơn nhiều so với sổ đăng ký cho chúng tôi, nó sạch hơn và dễ dàng hơn để thổi ra nếu bất cứ điều gì bị hỏng hoặc cần phải được đặt lại.

2

Chúng tôi lưu trữ tất cả trong số Isolation Storage (chúng tôi đang chạy bằng ClickOnce). Chúng tôi có một số đối tượng mà chúng tôi tuần tự hóa (XmlSerializer).

1

Chúng tôi sử dụng Trình cài đặt tùy chỉnh để lưu trữ thông tin cấu hình trong bảng trong cơ sở dữ liệu của ứng dụng. Đây là một giải pháp tốt nếu bạn đã sử dụng cơ sở dữ liệu.

1

Trong Lập trình WPF Chris Sells & Ian Griffiths nó nói

Cơ chế thiết lập ưa thích cho các ứng dụng WPF là một trong những cung cấp bởi .NET và VS: lớp ApplicationSettingBase từ namespace System.Configuration với xây dựng - thiết kế.

+0

Thật không may thiết kế cài đặt (trong vs2008) materializes bất kỳ cài đặt bạn thiết lập trong các nhà thiết kế như DefaultSettingValueAttribute mục trong settings.Designer.vb. Dường như không có cách nào để tắt chức năng này. Nếu bạn chỉnh sửa tệp cấu hình bằng tay, thì lần sau bạn chỉnh sửa trong trình thiết kế cài đặt, nó sẽ đồng bộ hóa lại. Điều này thật tệ. Nó có thể dẫn đến một ứng dụng đang được triển khai với các giá trị mặc định được mã hóa cứng (phần nào bị ẩn), điều đó sẽ có tác dụng nếu cài đặt app.config bị thiếu. http://tinyurl.com/3xyzz66 – Topdown

10

Cách nhanh hơn để lưu cài đặt giao diện người dùng là sử dụng hệ thống Properties.Settings.Default. Những gì có thể được tốt đẹp với nó là sử dụng WPF ràng buộc với giá trị. Example here. Settins được tự động cập nhật và tải.

<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); 
} 

Vấn đề với việc nhanh chóng trở thành mớ hỗn độn nếu ứng dụng của bạn lớn.

Một giải pháp khác (được đề xuất bởi ai đó ở đây) là sử dụng đường dẫn ApplicationData để lưu trữ các tùy chọn của riêng bạn vào XML. Ở đó bạn có thể xây dựng lớp thiết lập của riêng bạn và sử dụng bộ nối tiếp XML để duy trì nó. Cách tiếp cận này cho phép bạn di chuyển từ phiên bản sang phiên bản. Trong khi mạnh hơn, phương thức này yêu cầu mã nhiều hơn một chút.

4

Đào sâu vào câu trả lời của aogan và kết hợp nó với câu trả lời của decasteljau và bài đăng trên blog mà anh ta tham chiếu, đây là ví dụ điền vào một số khoảng trống không rõ ràng với tôi.

Các tập tin 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}" 
    ... 

Và các tập tin nguồn:

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; } 
     } 
    } 
}