c# - Changing a Polygon's Points -
solution dynamic margin on window drag
so i'm trying polygon move window moved. have;
private void resetpolygon(point point1, point point2, point point3) { speechpoly.points.clear(); observablecollection<point> mypointcollection = new observablecollection<point>(); mypointcollection.add(point3); mypointcollection.add(point2); mypointcollection.add(point1); foreach (point p in mypointcollection) { speechpoly.points.add(p); } } private void window_locationchanged(object sender, eventargs e) { if (this.isloaded) { point point1 = new point(newpoint3); point point2 = new point(newpoint2); point point3 = new point(newpoint1); resetpolygon(newpoint1, newpoint2, newpoint3); //write out values of both list , polygon screen! txtblock.text = newpoint1.x.tostring("n2") + ", " + newpoint1.y.tostring("n2") + "\n" + newpoint2.x.tostring("n2") + ", " + newpoint2.y.tostring("n2") + "\n" + newpoint3.x.tostring("n2") + ", " + newpoint3.y.tostring("n2"); txtblock.text += "\n" + speechpoly.points[0].x.tostring("n2") + ", " + speechpoly.points[0].y.tostring("n2") + "\n" + speechpoly.points[1].x.tostring("n2") + ", " + speechpoly.points[1].y.tostring("n2") + "\n" + speechpoly.points[2].x.tostring("n2") + ", "+ speechpoly.points[2].y.tostring("n2"); } } but polygon remains same shape no matter what, though textblock shows values of points in list , polygon's points changing.
i've tried bind points property of polygon code.
<polygon name="speechpoly" points="{binding mypointcollection, relativesource={relativesource findancestor, ancestortype=window}}" stroke="black" strokethickness="2" </polygon> i've tried using pointscollection opposed list<points> same result. seems polygon not refreshing.
i not being satisfied previous answer gave after workaround..
i found better solution problem not require reset databinds.
so binding xaml being directed property incc data converted points polygon use when drawing.
<window x:class="wpfapplication9.mainwindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:wpfapplication9" title="mainwindow" height="350" width="525" locationchanged="window_locationchanged" > <window.resources> <local:mypointcollectionconverter x:key="mcolconv" /> </window.resources> <canvas> <polygon name="speechpoly" stroke="black" strokethickness="2" points="{binding path=mypointcollection, converter={staticresource mcolconv}}" /> </canvas> using system; using system.collections.objectmodel; using system.componentmodel; using system.windows; using system.windows.data; using system.windows.media; namespace wpfapplication9 { /// <summary> /// interaction logic mainwindow.xaml /// </summary> public partial class mainwindow : window, inotifypropertychanged { public event propertychangedeventhandler propertychanged; private observablecollection<point> _mypointcollection = new observablecollection<point>(); public observablecollection<point> mypointcollection { { return _mypointcollection; } } public mainwindow() { mypointcollection.add(new point(100, 50)); mypointcollection.add(new point(150, 100)); mypointcollection.add(new point(50, 100)); initializecomponent(); datacontext = this; } private void resetpolygon(point point1, point point2, point point3) { mypointcollection.clear(); mypointcollection.add(point1); mypointcollection.add(point2); mypointcollection.add(point3); if (propertychanged != null) propertychanged(this, new propertychangedeventargs("mypointcollection")); } private void window_locationchanged(object sender, eventargs e) { if (this.isloaded) { random rnd = new random(); point point1 = new point(rnd.next(50, 200), rnd.next(50, 200)); point point2 = new point(rnd.next(50, 200), rnd.next(50, 200)); point point3 = new point(rnd.next(50, 200), rnd.next(50, 200)); resetpolygon(point1, point2, point3); } } } public class mypointcollectionconverter : ivalueconverter { #region ivalueconverter members public object convert(object value, type targettype, object parameter, system.globalization.cultureinfo culture) { var regptscoll = new pointcollection(); //regular points collection. var obsptscoll = (observablecollection<point>)value; //observable used raise incc event. foreach (var point in obsptscoll) regptscoll.add(point); return regptscoll; } public object convertback(object value, type targettype, object parameter, system.globalization.cultureinfo culture) { return null; } #endregion } }
Comments
Post a Comment