2009-04-05 12 views
5

मेरे कार्यक्रम में मेरे पास तीन अलग-अलग यूआई स्टेटस (सामान्य, सफलता और त्रुटि) हैं और प्रत्येक में नियंत्रण दिखाई/छुपा, सक्षम/अक्षम, रंग बदलते हैं, लेबल अलग-अलग चीजें कहते हैं ... आदि। और मेरे कोड-पीछे में मैं मूल रूप से ChangeWindowState (UI.Normal) कहने में सक्षम होना चाहता हूं;यूआई स्टेट मशीन को लागू करने का सबसे अच्छा तरीका क्या है?

तो मेरा सवाल यह है कि प्रत्येक राज्य के लिए नियंत्रण में परिवर्तन कैसे लागू किया जाए?

बेशक मैं मैन्युअल रूप से कोड-बैक में नियंत्रण बदल सकता हूं, लेकिन मुझे आश्चर्य है कि शायद wpf विषयों या शैलियों का उपयोग करके बेहतर तरीका हो सकता है। तो शायद मैं "त्रुटि" विषय का उपयोग करने के लिए विंडो सेट कर सकता हूं, जिसे मैंने पूर्व परिभाषित किया है। मैं वास्तव में इस समय उन्हें समझ नहीं तो मैं शब्दावली गलत उपयोग किया जा सकता है, लेकिन अगर किसी ने मुझे सही दिशा कैसे सबसे अच्छा कुछ इस तरह करने के लिए बात कर सकता है मुझे खुशी होगी।

धन्यवाद!

उत्तर

5

इस पर पहुंचने के कई तरीके हैं। यदि आपके पास प्रोग्राम-स्टेट "ऑब्जेक्ट मॉडल" था तो आप डेटा टेम्पलेट्स और डेटाट्रिगर्स के कुछ संयोजन का उपयोग कर सकते हैं। इस मान लिया जाये कि मामला नहीं है, यहाँ एक और तरीका है: आप एक खिड़की करने के लिए भेजा, तो आप इस तरह एक "निर्भरता संपत्ति" अपने विंडो वर्ग में परिभाषित तो लगता है:

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 
} 

अब आप किसी भी की काफी किसी भी संपत्ति को बदल सकते हैं खिड़की, या तो प्रत्यक्ष बंधन या एक ट्रिगर द्वारा (खिड़की खुद सहित) के तत्व।

<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

इस तरह की चीज़ के लिए मैंने हमेशा "अपडेटयूआई()" फ़ंक्शन किया है। यह फ़ंक्शन मॉडल/सदस्य गुण/स्थिति की स्थिति को देखता है और जो भी करता है/अक्षम करता है, छिपाता/दिखाता है। इस कोड को फैलाने की कोशिश करने से हमेशा एक समस्या होती है (इसलिए "चेंजविंडोज़स्टेट (..)" वास्तव में केवल एक संपत्ति सेट करता है और फिर "UpdateUI()") को कॉल करता है।

मैं एक सामान्य तरीके से इस संभाल करने के लिए कुछ प्रयास देखा है ... लेकिन कोई भी है कि मैं वास्तव में (उदाहरण के WTL सामान के लिए) पसंद आया। आम तौर पर इन्हें बुरी तरह कार्यान्वित नहीं किया जाता है ... लेकिन वे जो भी कर सकते हैं उससे तेज़ी से आगे बढ़ना आसान है। और आम तौर पर राज्य तर्क काफी महत्वपूर्ण है कि यह स्पष्ट रूप से हो रही है आसान के साथ कोडित यदि/तो/किसी और शैली तर्क कम भ्रम (रखरखाव, डिबगिंग, आदि) की ओर जाता है।

3

आप के लिए एक अन्य विकल्प संभवतः VisualStateManager जो WPFToolkit के हिस्से के रूप में जारी किया गया है: यहाँ एक संपत्ति ट्रिगर के माध्यम से खिड़की की पृष्ठभूमि का रंग बदल रहा है, इसका एक उदाहरण।

अधिक जानकारी इन कड़ियों के माध्यम से है:

गुड लक।

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