2013-01-10 28 views
5

मैं डब्ल्यूपीएफ में प्रोग्रेसबार की वैल्यू प्रॉपर्टी को डाटाबेस करने की कोशिश कर रहा हूं। मेरे पास प्रोग्रेसबार के मूल्य के लिए डाटाबेस int संपत्ति को बढ़ाने के लिए एक बटन सेट अप किया गया है। जब मैं बटन दबाता हूं तो इसे प्रोग्रेसबार की वैल्यू 1 से 100 तक गिनती करनी चाहिए। हालांकि ... ऐसा लगता है कि यह काम नहीं कर रहा है और मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं। यहाँ मेरी XAML ...डब्ल्यूपीएफ प्रोग्रेसबार वैल्यू डाटाबेसिंग

<Window x:Class="ProgressBarExample2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="250" Width="400" Background="WhiteSmoke"> 
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> 
    <Button Name="goButton" Height="30" Width="50" Margin="0,10,0,50" Click="goButton_Click">GO!</Button> 
    <ProgressBar Name="progressBar" Width="300" Height="30" Value="{Binding Percent, UpdateSourceTrigger=PropertyChanged}" /> 
</StackPanel> 

और यहाँ मेरे कोड के पीछे है ...

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void NotifyPropertyChange(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #endregion 

    private int percent = 0; 
    public int Percent 
    { 
     get { return this.percent; } 
     set 
     { 
      this.percent = value; 
      NotifyPropertyChange("Percent"); 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 


    private void goButton_Click(object sender, RoutedEventArgs e) 
    { 
     for (Percent = 0; Percent <= 100; Percent++) 
     { 
      Thread.Sleep(50); 
     } 
    } 
} 
+0

आप शायद बटन पर एक timer- टाइमर प्रारंभ क्लिक करें जोड़ने की कोशिश कर सकते हैं के क्लिक करें घटना में इसका इस्तेमाल कर सकते हैं। टाइमर कॉलबैक में वृद्धि प्रतिशत - उचित डेटा-बाध्यकारी के साथ यह सिर्फ काम करना चाहिए। टाइमर कॉलबैक पृष्ठभूमि धागे में हैं, इसलिए आपका मुख्य धागा प्रगति पट्टी – Sarang

उत्तर

1

कोई कोड है (पोस्ट) विंडो की DataContext सेट है कि (या StackPanel)।

कारण के बारे में सुनिश्चित करने के लिए, बाध्यकारी त्रुटियों के लिए आउटपुट विंडो देखें।


और इसके अलावा में,

private void goButton_Click(object sender, RoutedEventArgs e) 
{ 
    for (Percent = 0; Percent <= 100; Percent++) 
    { 
     Thread.Sleep(50); 
    } 
} 

इस ब्लॉक संदेश प्रसंस्करण इसलिए यदि आपका एप्लिकेशन 5 सेकंड के लिए 'अनुत्तरदायी' होगा। कोई इनपुट प्रोसेसिंग नहीं है और कोई स्क्रीन अपडेट नहीं होगा। एक व्यस्त लूप एक घटना संचालित जीयूआई में बस अच्छा नहीं है।

इस कोड को पृष्ठभूमि कार्यकर्ता में ले जाएं या टाइमर का उपयोग करें।

+0

अहह को अद्यतन करने के लिए स्वतंत्र है, जो मैं भूल गया था ... ठीक है कि इसे ठीक किया गया है ... लेकिन यह वास्तविक समय में मूल्य को अपडेट नहीं करता है ... अब अगर मैं सोने का समय बढ़ाता हूं तो यह सिर्फ 0 से 100 प्रतिशत तक कूदता है ... – user1451495

+0

इसके लिए भी एक उत्तर जोड़ा गया। –

6

थ्रेड। सोई यूआई थ्रेड को अवरुद्ध कर रहा है और प्रगति पट्टी की एनीमेशन को रोक रहा है।

यूआई थ्रेड को अवरुद्ध किए बिना आप निष्पादन को रोकने के लिए निम्न का उपयोग कर सकते हैं। साथ Wait(50)

संपादित अपने Thread.Sleep(50) कॉल बदलें: निकाला प्रतिनिधि

/// <summary> 
/// Stop execution for a specific amount of time without blocking the UI 
/// </summary> 
/// <param name="interval">The time to wait in milliseconds</param> 
public static void Wait(int interval) 
{ 
    ExecuteWait(() => Thread.Sleep(interval)); 
} 

public static void ExecuteWait(Action action) 
{ 
    var waitFrame = new DispatcherFrame(); 

    // Use callback to "pop" dispatcher frame 
    IAsyncResult op = action.BeginInvoke(dummy => waitFrame.Continue = false, null); 

    // this method will block here but window messages are pumped 
    Dispatcher.PushFrame(waitFrame); 

    // this method may throw if the action threw. caller's responsibility to handle. 
    action.EndInvoke(op); 
} 
+0

पूरे दिन बर्बाद हो गया कि यह पता लगाने की कोशिश क्यों कि यूआई जमे हुए है। मुझे नौसिखिया – NotAgain

0

डेटा बाइंडिंग के बिना अन्य समाधान कर रहे हैं। आप एक प्रतिनिधि

private delegate void UpdateProgressBarDelegate(System.Windows.DependencyProperty dp, Object value);

घोषित करने और बटन

private void goButton_Click(object sender, RoutedEventArgs e) 
     { 
      //Configure the ProgressBar 
      progressBar.Minimum = 0; 
      progressBar.Maximum = 100; 
      progressBar.Value = 0; 

      //Stores the value of the ProgressBar 
      double value = 0; 

      //Create a new instance of our ProgressBar Delegate that points 
      // to the ProgressBar's SetValue method. 
      UpdateProgressBarDelegate updatePbDelegate = new UpdateProgressBarDelegate(progressBar.SetValue); 

      //Tight Loop: Loop until the ProgressBar.Value reaches the max 
      do 
      { 
       value += 1; 

       /*Update the Value of the ProgressBar: 
        1) Pass the "updatePbDelegate" delegate that points to the ProgressBar1.SetValue method 
        2) Set the DispatcherPriority to "Background" 
        3) Pass an Object() Array containing the property to update (ProgressBar.ValueProperty) and the new value */ 
       Dispatcher.Invoke(updatePbDelegate, 
        System.Windows.Threading.DispatcherPriority.Background, 
        new object[] { ProgressBar.ValueProperty, value }); 

      } 
      while (progressBar.Value != progressBar.Maximum); 
     }