c# - Timer isn't working in WPF -


guys trying run progressbar using dispatchertimer. created event "timer_tick" , changing value of progressbar. isn't working. new wpf plss me problem. :)

using system; using system.collections.generic; using system.linq; using system.text; using system.threading.tasks; using system.windows; using system.windows.controls; using system.windows.data; using system.windows.documents; using system.windows.input; using system.windows.media; using system.windows.media.imaging; using system.windows.navigation; using system.windows.shapes; using system.windows.forms; using system.windows.threading;  namespace wpfapplication1 {     public partial class mainwindow : window     {         dispatchertimer timer = new dispatchertimer();         int counter = 1;         public event eventhandler onformloading;          public mainwindow()         {             initializecomponent();             onformloading += mainwindow_onformloading;          }          void mainwindow_onformloading(object sender, eventargs e)         {             progressbar1.maximum = 10;             progressbar1.value = 0;             progressbar1.minimum = 0;             timer.tick += timer_tick;             timer.interval = new timespan(0, 0, 10);             timer.start();          }          void timer_tick(object sender, eventargs e)         {              progressbar1.value += counter;              if (counter == 10) timer.stop();              counter++;         }          private void form1_loaded(object sender, routedeventargs e)         {              onformloading(this, new eventargs());          }     } } 

xaml code:

<window x:name="form1" x:class="wpfapplication1.mainwindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         title="mainwindow" height="600" width="800" loaded="form1_loaded">     <grid background="#ff070b34">         <grid.columndefinitions>             <columndefinition width="395*"/>             <columndefinition width="298*"/>             <columndefinition width="99*"/>         </grid.columndefinitions>         <grid.rowdefinitions>             <rowdefinition height="308*"/>             <rowdefinition height="261*"/>         </grid.rowdefinitions>         <textblock height="41" margin="190,31,93.015,0" textwrapping="wrap" verticalalignment="top" fontsize="24" fontfamily="times new roman" foreground="#ff4c5fd8" grid.columnspan="2">             <textblock.effect>                 <dropshadoweffect color="#ff8a83d3" renderingbias="quality" shadowdepth="0"/>             </textblock.effect><run language="en-gb" text="welcome e-voting machine"/></textblock>         <image source="c:\users\hussam\documents\visual studio 2013\projects\wpfapplication1\wpfapplication1\bin\debug\emachine.jpg" margin="64,0,64,87" grid.rowspan="2" grid.columnspan="3" height="393" verticalalignment="bottom" >             <image.opacitymask>                 <lineargradientbrush endpoint="0.5,1" startpoint="0.5,0">                     <gradientstop color="black" offset="0"/>                     <gradientstop color="white" offset="1"/>                 </lineargradientbrush>             </image.opacitymask>         </image>         <progressbar x:name="progressbar1" horizontalalignment="left" value="0" minimum="0" height="27" margin="140,200,0,0" verticalalignment="top" width="512" grid.row="1" grid.columnspan="2"/>      </grid> </window> 

read msdn article, explains need.

https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer(v=vs.110).aspx

it best use system.timer.timer instead of dispatch timer. timer runs on different thread therefore ui update must done via delegate.

public partial class mainwindow : window     {         private system.timers.timer _timer;         private int count = 0;          public mainwindow()         {             initializecomponent();              _timer = new timer(1000);             _timer.elapsed += _timer_elapsed;             _timer.enabled = true;             _timer.start();         }          void _timer_elapsed(object sender, elapsedeventargs e)         {             this.dispatcher.invoke(updateprogressbar);         }          private void updateprogressbar()         {             progressbar1.value = count;             count++;         }     } 

Comments