2009-04-05 55 views
5

Trong chương trình của tôi, tôi có ba trạng thái UI riêng biệt (Bình thường, Thành công và Lỗi) và trong mỗi điều khiển có thể nhìn thấy/ẩn, bật/tắt, thay đổi màu sắc, nhãn nói những điều khác nhau ... v.v. và trong code-behind của tôi về cơ bản tôi muốn có thể nói ChangeWindowState (UI.Normal);Cách tốt nhất để triển khai máy trạng thái giao diện người dùng là gì?

Vì vậy, câu hỏi của tôi là cách tốt nhất để triển khai các thay đổi kiểm soát cho từng tiểu bang?

Tất nhiên tôi có thể thay đổi điều khiển theo cách thủ công trong mã sau, nhưng tôi tự hỏi liệu có thể có cách nào tốt hơn bằng cách sử dụng các chủ đề hoặc phong cách wpf hay không. Sau đó, có lẽ tôi chỉ có thể đặt cửa sổ để sử dụng chủ đề "Lỗi" mà tôi đã xác định trước. Tôi không thực sự hiểu họ vào lúc này vì vậy tôi có thể sử dụng thuật ngữ sai, nhưng tôi sẽ đánh giá cao nếu có ai đó có thể chỉ cho tôi đúng hướng như thế nào tốt nhất để làm một cái gì đó như thế này.

Cảm ơn!

Trả lời

5

Có nhiều cách để tiếp cận điều này, tất nhiên. Nếu bạn có một "mô hình đối tượng" chương trình, bạn có thể sử dụng một số kết hợp của DataTemplates và DataTriggers. Giả sử đây không phải là trường hợp, đây là cách tiếp cận khác: Bạn gọi một cửa sổ, vì vậy giả sử bạn định nghĩa một "tài sản phụ thuộc" trong cửa sổ lớp học của bạn như thế này:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     this.InitializeComponent(); 

     // Insert code required on object creation below this point. 
    } 

    public ProgramStatus ProgramStatus 
    { 
     get { return (ProgramStatus)GetValue(ProgramStatusProperty); } 
     set { SetValue(ProgramStatusProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ProgramStatus. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ProgramStatusProperty = 
     DependencyProperty.Register("ProgramStatus", typeof(ProgramStatus), typeof(Window1), new UIPropertyMetadata(null)); 
} 

public enum ProgramStatus 
{ 
    Normal, 
    Success, 
    Error 
} 

Bây giờ bạn có thể thay đổi khá nhiều bất cứ tài sản của bất kỳ phần tử của cửa sổ (bao gồm cả cửa sổ chính nó), bởi một trong hai ràng buộc trực tiếp hoặc một kích hoạt. Dưới đây là ví dụ về thay đổi màu nền của cửa sổ thông qua trình kích hoạt thuộc tính:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:l="clr-namespace:Test" 
    x:Class="Test.Window1" 
    x:Name="Window" 
    Title="Window1" 
    Width="640" Height="480"> 
    <Window.Style> 
     <Style TargetType="{x:Type l:Window1}"> 
      <Style.Triggers> 
       <Trigger Property="ProgramStatus"> 
        <Trigger.Value> 
         <l:ProgramStatus>Error</l:ProgramStatus> 
        </Trigger.Value> 
        <Setter Property="Background" Value="Red" /> 
       </Trigger> 
       <Trigger Property="ProgramStatus"> 
        <Trigger.Value> 
         <l:ProgramStatus>Normal</l:ProgramStatus> 
        </Trigger.Value> 
        <Setter Property="Background" Value="Blue" /> 
       </Trigger> 
       <Trigger Property="ProgramStatus"> 
        <Trigger.Value> 
         <l:ProgramStatus>Success</l:ProgramStatus> 
        </Trigger.Value> 
        <Setter Property="Background" Value="Green" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Style> 
    <Grid x:Name="LayoutRoot"/> 
</Window> 
1

Đối với loại điều này tôi đã khá nhiều luôn luôn thực hiện một "UpdateUI()" chức năng. Hàm này xem xét trạng thái của mô hình/thuộc tính/trạng thái thành viên và cho phép/vô hiệu hóa, ẩn/hiện, bất cứ điều gì. Cố gắng để lây lan mã này ra luôn luôn dẫn đến một vấn đề (vì vậy "ChangeWindowsState (..)" thực sự chỉ cần thiết lập một tài sản và sau đó gọi "UpdateUI()").

Tôi đã nhìn thấy một vài nỗ lực để xử lý việc này theo cách chung chung ... nhưng không có điều gì tôi thực sự thích (ví dụ: công cụ WTL). Nói chung những điều này không được triển khai thực hiện ... nhưng chỉ dễ dàng vượt quá nhanh những gì họ có thể làm. Và nói chung logic của nhà nước là đủ quan trọng để có nó được mã hóa rõ ràng với logic đơn giản nếu/sau đó/phong cách khác dẫn đến ít nhầm lẫn hơn (bảo trì, gỡ lỗi, v.v.).

Các vấn đề liên quan