<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Nico-pyright(c) &#187; WPF</title>
	<atom:link href="https://blog.developpez.com/nico-pyright/pcategory/ccli/wpf/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/nico-pyright</link>
	<description></description>
	<lastBuildDate>Mon, 08 Apr 2013 09:26:35 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>[Winforms] [C++/CLI][C#] Databinding Bidirectionnel avec les Winforms</title>
		<link>https://blog.developpez.com/nico-pyright/p6425/ccli/winforms_c_cli_c_databinding_bidirection</link>
		<comments>https://blog.developpez.com/nico-pyright/p6425/ccli/winforms_c_cli_c_databinding_bidirection#comments</comments>
		<pubDate>Sun, 21 Sep 2008 08:30:58 +0000</pubDate>
		<dc:creator><![CDATA[nico-pyright(c)]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[C++/CLI]]></category>
		<category><![CDATA[Winforms]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le binding bidirectionnel consiste à &#171;&#160;associer&#160;&#187; une propriété de classe à un controle de Formulaire. Par exemple, j&#8217;ai un textbox sur ma form qui est associé à une chaine (String) dans ma classe. Toute modification de ce textbox entraine automatiquement une modification de ma chaine. Inversement, toute modification de cette chaine en code, implique une répercution visuelle sur la valeur du textbox. Voici comment implémenter un tel binding : Le principe est d&#8217;utiliser l&#8217;interface INotifyPropertyChanged. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le binding bidirectionnel consiste à &laquo;&nbsp;associer&nbsp;&raquo; une propriété de classe à un controle de Formulaire.</p>
<p>Par exemple, j&rsquo;ai un textbox sur ma form qui est associé à une chaine (String) dans ma classe. Toute modification de ce textbox entraine automatiquement une modification de ma chaine. Inversement, toute modification de cette chaine en code, implique une répercution visuelle sur la valeur du textbox.</p>
<p>Voici comment implémenter un tel binding :</p>
<p><span id="more-18"></span></p>
<p>Le principe est d&rsquo;utiliser l&rsquo;interface <a href="http://msdn.microsoft.com/fr-fr/library/system.componentmodel.inotifypropertychanged.aspx">INotifyPropertyChanged</a>. L&rsquo;appel de l&rsquo;événement <a href="http://msdn.microsoft.com/fr-fr/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx">PropertyChanged</a> permet d&rsquo;informer que la valeur a changé et automatiquement répercuter ce changement.</p>
<p>Voici comment faire en C++/CLI (plus loin, la version C#) :</p>
<p>Tout d&rsquo;abord, la form doit implémenter INotifyPropertyChanged</p>
<p><code class="codecolorer text default"><span class="text">public ref class Form1 : public System::Windows::Forms::Form, INotifyPropertyChanged</span></code></p>
<p>Ceci implique de définir l&rsquo;événement suivant :</p>
<p><code class="codecolorer text default"><span class="text">virtual event PropertyChangedEventHandler ^PropertyChanged;</span></code></p>
<p>Il nous faut ensuite une propriété de type String. C&rsquo;est cette propriété qui sera bindée à notre TextBox :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private: <br />
&nbsp; String ^_chaine; <br />
public: <br />
&nbsp; property String ^Chaine <br />
&nbsp; { <br />
&nbsp; &nbsp; String ^ get() { return _chaine; } <br />
&nbsp; &nbsp; void set(String ^value) &nbsp;<br />
&nbsp; &nbsp; { &nbsp;<br />
&nbsp; &nbsp; &nbsp; if (value != _chaine) <br />
&nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; _chaine = value; <br />
&nbsp; &nbsp; &nbsp; &nbsp; NotifyPropertyChanged(&quot;Chaine&quot;); <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; } <br />
&nbsp; }</div></div>
<p>On note l&rsquo;appel à la méthode NotifyPropertyChanged pour indiquer une changement de valeur.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private: <br />
&nbsp; void NotifyPropertyChanged(String ^info) <br />
&nbsp; { <br />
&nbsp; &nbsp; PropertyChanged(this, gcnew PropertyChangedEventArgs(info)); <br />
&nbsp; }</div></div>
<p>La méthode NotifyPropertyChanged appelle l&rsquo;événement PropertyChanged pour signaler le changement afin qu&rsquo;il soit répercuté à tous les endroits où le binding est effectué.</p>
<p>Ne pas oublier de définir le binding, au plus tot, dans le form_load par exemple :<br />
<code class="codecolorer text default"><span class="text">textBox1-&gt;DataBindings-&gt;Add(&quot;Text&quot;, this, &quot;Chaine&quot;);</span></code></p>
<p>Et le tour est joué.</p>
<p>Voici la syntaxe pour du C# :</p>
<p><code class="codecolorer text default"><span class="text">public partial class Form1 : Form, INotifyPropertyChanged</span></code></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private string _chaine; <br />
public string Chaine <br />
{ <br />
&nbsp; &nbsp; get { return _chaine; } <br />
&nbsp; &nbsp; set <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (value != _chaine) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _chaine = value; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NotifyPropertyChanged(&quot;Chaine&quot;); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; } <br />
} <br />
&nbsp;<br />
private void Form1_Load(object sender, EventArgs e) <br />
{ <br />
&nbsp; &nbsp; textBox1.DataBindings.Add(&quot;Text&quot;, this, &quot;Chaine&quot;); <br />
} <br />
&nbsp;<br />
public event PropertyChangedEventHandler PropertyChanged; <br />
&nbsp;<br />
private void NotifyPropertyChanged(String info) <br />
{ <br />
&nbsp; &nbsp; if (PropertyChanged != null) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; PropertyChanged(this, new PropertyChangedEventArgs(info)); <br />
&nbsp; &nbsp; } <br />
}</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[C#][Winforms] Ne lancer qu&#8217;une seule instance de son application</title>
		<link>https://blog.developpez.com/nico-pyright/p6408/c/c_winforms_ne_lancer_qu_une_seule_instan</link>
		<comments>https://blog.developpez.com/nico-pyright/p6408/c/c_winforms_ne_lancer_qu_une_seule_instan#comments</comments>
		<pubDate>Thu, 18 Sep 2008 20:00:00 +0000</pubDate>
		<dc:creator><![CDATA[nico-pyright(c)]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour ce faire, on va utiliser un mutex Il suffit d&#8217;encadrer l&#8217;instanciation par défaut de la form dans le fichier Program.cs bool owned; Mutex mutex = new Mutex(true, &#34;Mon_Mutex_Pour_Mon_Application&#34;, out owned); if (owned) { &#160; Application.EnableVisualStyles(); &#160; Application.SetCompatibleTextRenderingDefault(false); &#160; Application.Run(new Form1()); &#160; mutex.ReleaseMutex(); } else &#160; MessageBox.Show(&#34;L'application est déjà lancée&#34;); Et voilà]]></description>
				<content:encoded><![CDATA[<p>Pour ce faire, on va utiliser <a href="http://msdn.microsoft.com/fr-fr/library/system.threading.mutex(VS.80).aspx">un mutex </a></p>
<p><span id="more-46"></span></p>
<p>Il suffit d&rsquo;encadrer l&rsquo;instanciation par défaut de la form dans le fichier Program.cs</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bool owned; <br />
Mutex mutex = new Mutex(true, &quot;Mon_Mutex_Pour_Mon_Application&quot;, out owned); <br />
if (owned) <br />
{ <br />
&nbsp; Application.EnableVisualStyles(); <br />
&nbsp; Application.SetCompatibleTextRenderingDefault(false); <br />
&nbsp; Application.Run(new Form1()); <br />
&nbsp; mutex.ReleaseMutex(); <br />
} <br />
else <br />
&nbsp; MessageBox.Show(&quot;L'application est déjà lancée&quot;);</div></div>
<p>Et voilà</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[C#] Une PictureBox qu&#8217;on peut déplacer et redimensionner à la souris</title>
		<link>https://blog.developpez.com/nico-pyright/p5104/c/c_une_picturebox_qu_on_peut_deplacer_et_</link>
		<comments>https://blog.developpez.com/nico-pyright/p5104/c/c_une_picturebox_qu_on_peut_deplacer_et_#comments</comments>
		<pubDate>Fri, 15 Feb 2008 20:00:00 +0000</pubDate>
		<dc:creator><![CDATA[nico-pyright(c)]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J&#8217;ai écrit vite fait cette petite classe qui surcharge la classe PictureBox pour les besoins d&#8217;un copain. Et puis, je me dis qu&#8217;il pourrait être bon d&#8217;en faire profiter tout le monde. Au menu, une surcharge de l&#8217;événement Paint et un dessin de rectangle (très moche, je sais ) et les surcharges des événements de click souris (down et up) et de son mouvement. class MaPictureBox : PictureBox { private bool isResizing; private bool isCandidateToResize; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;ai écrit vite fait cette petite classe qui surcharge la classe PictureBox pour les besoins d&rsquo;un copain. Et puis, je me dis qu&rsquo;il pourrait être bon d&rsquo;en faire profiter tout le monde.</p>
<p><span id="more-41"></span></p>
<p>Au menu, une surcharge de l&rsquo;événement Paint et un dessin de rectangle (très moche, je sais <img src="https://blog.developpez.com/nico-pyright/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> ) et les surcharges des événements de click souris (down et up) et de son mouvement.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class MaPictureBox : PictureBox <br />
{ <br />
private bool isResizing; <br />
private bool isCandidateToResize; <br />
private Point positionClick; <br />
&nbsp;<br />
protected override void OnPaint(PaintEventArgs pe) <br />
{ <br />
&nbsp; &nbsp; base.OnPaint(pe); <br />
&nbsp; &nbsp; if (isResizing) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; pe.Graphics.DrawRectangle(new Pen(Color.Red), new Rectangle(0, 0, Width - 1, Height - 1)); <br />
&nbsp; &nbsp; } <br />
} <br />
&nbsp;<br />
protected override void OnMouseMove(MouseEventArgs e) <br />
{ <br />
&nbsp; &nbsp; if (isResizing) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; Width = e.X; <br />
&nbsp; &nbsp; &nbsp; &nbsp; Height = e.Y; <br />
&nbsp; &nbsp; &nbsp; &nbsp; SizeMode = PictureBoxSizeMode.StretchImage; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; else <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (e.X &gt;= Width - 4 &amp;&amp; e.Y &gt;= Height - 4) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cursor = Cursors.SizeNWSE; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isCandidateToResize = true; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; else <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isCandidateToResize = false; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!isResizing) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (e.Button == MouseButtons.Left) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Location = new Point(Location.X + e.X - positionClick.X, Location.Y + e.Y - positionClick.Y); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cursor = Cursors.Arrow; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; Refresh(); <br />
&nbsp; &nbsp; base.OnMouseMove(e); <br />
} <br />
&nbsp;<br />
protected override void OnMouseDown(MouseEventArgs e) <br />
{ <br />
&nbsp; &nbsp; if (e.Button == MouseButtons.Left) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (isCandidateToResize) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isResizing = true; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Refresh(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; else <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isResizing = false; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; positionClick = e.Location; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; base.OnMouseDown(e); <br />
} <br />
&nbsp;<br />
protected override void OnMouseUp(MouseEventArgs e) <br />
{ <br />
&nbsp; &nbsp; if (e.Button == MouseButtons.Left) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; isResizing = false; <br />
&nbsp; &nbsp; &nbsp; &nbsp; isCandidateToResize = false; <br />
&nbsp; &nbsp; &nbsp; &nbsp; Refresh(); <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; base.OnMouseUp(e); <br />
} <br />
}</div></div>
<p>C&rsquo;est pas du tout optimisé, mais bon, c&rsquo;est une première base.</p>
<p>Ca s&rsquo;utilise comme une picturebox bien sur :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">MaPictureBox pic = new MaPictureBox(); <br />
pic.Image = Image.FromFile(@&quot;C:\test.png&quot;); <br />
pic.Width = pic.Image.Width; <br />
pic.Height = pic.Image.Height; <br />
Controls.Add(pic);</div></div>
<p><a href="ftp://ftp-developpez.com/nico-pyright/blog/testResize.rar">Télécharger le programme de test </a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
