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
Post a Comment