{"id":8604,"date":"2010-12-30T23:40:00","date_gmt":"2010-12-30T21:40:00","guid":{"rendered":"https:\/\/fatihboy.com\/post\/csharp-ile-html-editoru-yapiyoruz"},"modified":"2010-12-30T23:40:00","modified_gmt":"2010-12-30T21:40:00","slug":"csharp-ile-html-editoru-yapiyoruz","status":"publish","type":"post","link":"https:\/\/fatihboy.com\/en\/csharp-ile-html-editoru-yapiyoruz\/","title":{"rendered":"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz"},"content":{"rendered":"<p>&nbsp; Ge\u00e7ti\u011fimiz g\u00fcnlerde uzun zaman \u00f6nce geli\u015ftirdi\u011fim a\u00e7\u0131k kaynak kodlu projelerime tekrar bir g\u00f6z att\u0131m, biraz nostalji oldu bu asl\u0131na bakarsan\u0131z \ud83d\ude42 Projelerim aras\u0131nda 2003&#8217;\u00fcn ilk yar\u0131s\u0131nda geli\u015ftirmeye ba\u015flad\u0131\u011f\u0131m, son s\u00fcr\u00fcm\u00fc ise 2004 Ocak olan ve <a href=\"http:\/\/sourceforge.net\/projects\/softwarestudio\/\" target=\"_blank\" rel=\"noopener noreferrer\">SourceForge sitesi \u00fczerinden sundu\u011fum<\/a> <a href=\"\/en\/?page_id=1314\">Software Studio<\/a>&#8216;nun yeri bende ayr\u0131d\u0131r, vakit bulup bu projemi devam ettirmeyi \u00e7ok isterdim. Uygulamam i\u00e7erisinde Visual Studio&#8217;da da kullan\u0131lm\u0131\u015f olan \u015fekilde ana sayfamda ge\u00e7mi\u015f projeleri listelemi\u015ftim;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_StartPage.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_StartPage_thumb.png\" alt=\"Software Studio ba\u015flang\u0131\u00e7 sayfas\u0131\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; Ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde sa\u011f tarafta Start Page segmesinde g\u00f6rd\u00fc\u011f\u00fcn\u00fcz b\u00f6l\u00fcm asl\u0131nda uygulamaya g\u00f6m\u00fcl\u00fc bir browser i\u00e7erisinde sunulan bir html sayfas\u0131. \u00dcstelik bu html sayfas\u0131 i\u00e7erisinde bulunan &#8220;<em>Open File<\/em>&#8221; ve &#8220;<em>New File<\/em>&#8221; butonlar\u0131 vas\u0131tas\u0131yla host uygulamaya komut g\u00f6nderebilmekte, a\u00e7\u0131l\u0131\u015f\u0131nda host uygulamadan veri \u00e7ekebilmekte. Ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde g\u00f6rd\u00fc\u011f\u00fcn\u00fcz ge\u00e7mi\u015f dosyalar listesi ana uygulama i\u00e7erisinde yer alan bir fonksiyonun html sayfas\u0131ndaki bir javascript koduyla \u00e7a\u011f\u0131r\u0131lmas\u0131 sonucunda olu\u015fmaktad\u0131r. Bu projeyi geli\u015ftirdi\u011fim zamanlarda .Net i\u00e7erisinde gelen bile\u015fenler aras\u0131nda maalesef ki \u015fimdi oldu\u011fu gibi bir Web taray\u0131c\u0131s\u0131 yoktu ve sizin bu bile\u015feni kullanabilmeniz i\u00e7in ActiveX&#8217;ler ile s\u0131k s\u0131k muhatap olman\u0131z gerekiyordu. Ge\u00e7en zamanda \u015fansl\u0131y\u0131z ki art\u0131k .Net Framework ile birlikte bir web taray\u0131c\u0131 bile\u015feni de gelmekte ve pek \u00e7ok i\u015fi bizim i\u00e7in yapmakta. Bu makalemde \u00f6ncelikle sizlerle web taray\u0131c\u0131 bile\u015fenini kullanarak nas\u0131l ana uygulaman\u0131z ile sunmu\u015f oldu\u011funuz web sayfas\u0131 aras\u0131nda ileti\u015fimi sa\u011flayabilece\u011finizi payla\u015f\u0131yor, ard\u0131ndan da konuyu biraz daha \u00f6teye ta\u015f\u0131yarak bu bile\u015fen yard\u0131m\u0131yla nas\u0131l a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde yer alan gibi bir HTML edit\u00f6r\u00fc yapabilece\u011finizi (<em>evet, yanl\u0131\u015f okumad\u0131n\u0131z<\/em>) payla\u015f\u0131yor olaca\u011f\u0131m.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_HtmlEditor.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_HtmlEditor_thumb.png\" alt=\"Software Studio html editor\u00fc\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; Uygulama aray\u00fcz\u00fcn\u00fcze s\u00fcr\u00fckle-b\u0131rak ile ekleyebilece\u011finiz <strong>WebBrowser<\/strong> bile\u015feni sayesinde uygulaman\u0131za html dok\u00fcmanlar\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleme \u00f6zelli\u011fi yan\u0131nda tam anlam\u0131yla bir web deneyimini ta\u015f\u0131ma \u015fans\u0131na sahipsiniz. WPF&#8217;in hen\u00fcz olmad\u0131\u011f\u0131 zamanlarda .Net Framework&#8217;e eklenmi\u015f olan bu bile\u015fen, masa\u00fcst\u00fc uygulamalar\u0131yla k\u0131yasland\u0131\u011f\u0131nda, web&#8217;in canl\u0131 ve dinamik yap\u0131s\u0131 g\u00f6z \u00f6n\u00fcne al\u0131n\u0131rsa Windows Forms uygulamalar\u0131 i\u00e7in \u00f6nemli bir yenilikti. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda kullan\u0131c\u0131ya daha iyi bir deneyim sunabilecek kapasiteye sahip olan bu bile\u015fen pek \u00e7ok uygulamaya da h\u0131zl\u0131ca adapte edildi. Bu adaptasyonun bu kadar h\u0131zl\u0131 ve kolay olmas\u0131n\u0131n alt\u0131nda yatan neden WebBrowser bile\u015feninin <strong>ObjectForScripting<\/strong> \u00f6zelli\u011fi kullan\u0131larak html ve uygulama aras\u0131ndaki&nbsp; ileti\u015fimin kolayca sa\u011flan\u0131yor olmas\u0131d\u0131r. ObjectForScripting \u00f6zelli\u011fini nesne kabul etmesi nedeniyle uygulaman\u0131zdaki herhangi bir s\u0131n\u0131f\u0131n, hatta ana uygulama penceresini bile, html sayfas\u0131ndan ula\u015fabilir yapabilmeniz m\u00fcmk\u00fcn. Tek dikkat edilmesi gereken nokta ObjectForScripting \u00f6zelli\u011fine atayaca\u011f\u0131n\u0131z s\u0131n\u0131f\u0131n COM taraf\u0131ndan g\u00f6r\u00fclebilir (<strong>ComVisibleAttribute<\/strong>) olarak i\u015faretlenmi\u015f olmas\u0131d\u0131r. WebBrowser bile\u015feninin daha \u00f6nce bizlerin ActivX ile yapt\u0131\u011f\u0131m\u0131z i\u015flemleri arkaplanda bizim ad\u0131m\u0131za yapt\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnecek olursak, verece\u011fimiz s\u0131n\u0131f \u00f6rne\u011finin html \u00fczerinden kullan\u0131labilmesi i\u00e7in COM g\u00f6r\u00fclebilir olarak i\u015faretlenmesi gere\u011finin nedenini de anlayabiliriz. A\u015fa\u011f\u0131da \u00f6rnek olmas\u0131 ad\u0131na sizinle payla\u015ft\u0131\u011f\u0131m ve html ile uygulama aras\u0131nda veri transferinden sorumlu olan bir s\u0131n\u0131f\u0131 bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[ComVisible(true)]\npublic class TarayiciEntegrasyonu {\n    public string UygulamaSurumu { get; private set; }\n\n    public TarayiciEntegrasyonu() {\n        UygulamaSurumu = GetType().Assembly.GetName().Version.ToString();\n    }\n\n    public void YeniDosya() {\n        \/*Yeni Dosya olu\u015fturma i\u015f mant\u0131\u011f\u0131 kodlar\u0131*\/\n        MessageBox.Show(\"Yeni dosya olu\u015fturuldu\");\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; \u00d6rnek s\u0131n\u0131f\u0131m\u0131z, en basit \u015fekliyle, i\u00e7inde bulundu\u011fu assembly&#8217;nin s\u00fcr\u00fcm bilgisini sunmakta. A\u015fa\u011f\u0131da kodu kullanarak bu s\u0131n\u0131f\u0131 formumuzda bulunan web taray\u0131c\u0131 bile\u015fenimize tan\u0131tabiliriz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">webBrowser.ObjectForScripting = new TarayiciEntegrasyonu();\nwebBrowser.Navigate(acilisSayfasi);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu noktadan sonra script nesnemizi html i\u00e7erisinde kullanabilmek i\u00e7in biraz javascript kodu gerekli olacak. WebBrowser bile\u015feni i\u00e7erisinde sunulan html sayfalar\u0131ndan harici uygulama nesnemize&nbsp; ula\u015fabilmek i\u00e7in HTML DOM i\u00e7erisinde <strong>window<\/strong> nesnesi alt\u0131nda yer alan <strong>external<\/strong> \u00f6zelli\u011fi sunulmaktad\u0131r. A\u015fa\u011f\u0131da yer alan basit web sayfas\u0131, html y\u00fcklendi\u011finde <strong>onload<\/strong> olay\u0131n\u0131 tetikleyerek, bu olay\u0131 dinleyen <strong>SurumBilgisiniYaz<\/strong> fonksiyonunu \u00e7a\u011f\u0131racakt\u0131r. SurumBilgisiniYaz fonksiyonu ise versiyon id&#8217;li label bile\u015feninin i\u00e7eri\u011fine uygulama s\u00fcr\u00fcm bilgisini yazmakta.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!DOCTYPE HTML PUBLIC &quot;-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN&quot;&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;title&gt;&lt;\/title&gt;\n    &lt;script type=&quot;text\/javascript&quot; language=&quot;javascript&quot;&gt;\n        function SurumBilgisiniYaz() {\n            this.versiyon.innerText = &quot;Uygulama S&uuml;r&uuml;m&uuml; : &quot; + window.external.UygulamaSurumu;\n        }\n\n        function YeniDosya() {\n            window.external.YeniDosya();\n        }\n    &lt;\/script&gt;\n&lt;\/head&gt;\n&lt;body onload=&quot;SurumBilgisiniYaz&quot;&gt;\n    &lt;p&gt;\n        &lt;label id=&quot;versiyon&quot;&gt;\n        &lt;\/label&gt;\n    &lt;\/p&gt;\n    &lt;input type=&quot;button&quot; value=&quot;Yeni Dosya&quot; onclick=&quot;YeniDosya();&quot; \/&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_YeniHTMLEditor.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_YeniHTMLEditor_thumb.png\" alt=\"Etkile\u015fimli html a\u00e7\u0131l\u0131\u015f sayfas\u0131\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Benzer \u015fekilde sayfada yer alan &#8220;<em>Yeni Dosya<\/em>&#8221; butonuna t\u0131kland\u0131\u011f\u0131nda TarayiciEntegrasyonu s\u0131n\u0131f\u0131 YeniDosya fonksiyonu tetiklenerek ilgili i\u015f mant\u0131\u011f\u0131n\u0131n \u00e7al\u0131\u015fmas\u0131 sonras\u0131 kullan\u0131c\u0131 bir mesaj kutusu ile bilgilendirilmekte;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_MesajKutusu.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_MesajKutusu_thumb.png\" alt=\"Uygulama fonksiyonlar\u0131n\u0131 kullanabilen html dok\u00fcman\u0131\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; WebBrowser bile\u015feninin ObjectForScripting \u00f6zelli\u011fini kullanarak html i\u00e7erisinden tek tarafl\u0131 olarak uygulamam\u0131za eri\u015fimi tan\u0131mlam\u0131\u015f oluyoruz. Uygulamam\u0131z \u00fczerinden web browser i\u00e7eri\u011fiyle etkile\u015fimde bulunabilmek i\u00e7in bir ka\u00e7 y\u00f6ntem bulunmakta. Bu y\u00f6ntemlerden ilki ve en basiti, WebBrowser bile\u015feni <strong>Document<\/strong> \u00f6zelli\u011fini kullanarak HML DOM&#8217;a m\u00fcdahale etmek. A\u015fa\u011f\u0131daki \u00f6rne\u011fimizde sayfam\u0131z\u0131 siyah ardalan \u00fczerine beyaz font ile g\u00f6stermek i\u00e7in gerekli kod par\u00e7ac\u0131\u011f\u0131n\u0131 bulabilirsiniz;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_Ardalan.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_Ardalan_thumb.png\" alt=\"Html dok\u00fcman \u00f6zellikleri uygulama i\u00e7erisinden de\u011fi\u015ftirilebilir\"\/><\/a><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">webBrowser.Document.BackColor = Color.Black;\nwebBrowser.Document.ForeColor = Color.White;<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Kullan\u0131c\u0131 ile daha iyi bir etkile\u015fim kurabilmek ve daha canl\u0131 bir i\u00e7erik sunabilmek ad\u0131na yukar\u0131daki y\u00f6ntem d\u0131\u015f\u0131nda javascript kullan\u0131m\u0131 da mutlaka gerekecektir. WebBrowser bile\u015feni i\u00e7erisinden bir html sayfas\u0131ndaki javascripti fonksiyonunu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <strong>InvokeScript<\/strong>&nbsp; fonksiyonu kullan\u0131labilir. Kullan\u0131m\u0131 son derece basit olan ve \u00e7al\u0131\u015ft\u0131r\u0131lacak script ad\u0131 ile parametrelerinin verildi\u011fi bu fonksiyon i\u00e7in a\u015fa\u011f\u0131da \u00f6rnek bir kullan\u0131m bulabilirsiniz. \u00d6rne\u011fimizde ba\u015fta payla\u015ft\u0131\u011f\u0131m html sayfam\u0131z kullan\u0131lmakla birlikte body elementi i\u00e7erisindeki onLoad \u00f6zniteli\u011fi kald\u0131r\u0131lm\u0131\u015f, dolay\u0131s\u0131yla da a\u00e7\u0131l\u0131\u015fta SurumBilgisiniYaz fonksiyonunun \u00e7al\u0131\u015fmas\u0131 engellenmi\u015ftir.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">webBrowser.Document.InvokeScript(\"SurumBilgisiniYaz\");<\/pre>\n\n\n\n<p>&nbsp;&nbsp; G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi ObjectForScripting, Document ve InvokeScript kullan\u0131larak rahatl\u0131kla sundu\u011fumuz i\u00e7eri\u011fimiz ile uygulamam\u0131z aras\u0131nda \u00e7ift y\u00f6nl\u00fc bir ileti\u015fimi rahatl\u0131kla kurabilmekteyiz. WebBrowser i\u00e7eri\u011fi ile \u00e7ift tarafl\u0131 etkile\u015fimi g\u00f6rd\u00fckten sonra isterseniz \u015fimdi daha e\u011flenceli olan konumuza ge\u00e7elim; WebBrowser bile\u015fenini HTML Edit\u00f6r\u00fc olarak kullanmak.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_YeniHTMLEditor2.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/SoftwareStudio_YeniHTMLEditor2_thumb.png\" alt=\"WebBrowser bile\u015feni i\u00e7erisindeki html dok\u00fcman\u0131 d\u00fczenlenebilir hale geldi\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; WebBrowser&#8217;\u0131m\u0131z\u0131 html edit\u00f6r\u00fc olarak kullanabilmek i\u00e7in \u00f6ncelikle i\u00e7eri\u011fin d\u00fczenlenebilir olarak i\u015faretlenmesi gerekiyor. Bunu yapabilmek i\u00e7in bir ka\u00e7 y\u00f6ntem bulunmakta. \u0130lk iki y\u00f6ntemimiz bile\u015fenin arkaplanda kulland\u0131\u011f\u0131 ActivX hakk\u0131nda bilgisi olanlara y\u00f6nelik; ama merak etmeyin, \u00fc\u00e7\u00fcnc\u00fc y\u00f6ntemimiz \u00e7ok daha kolay \ud83d\ude42<\/p>\n\n\n\n<p>&nbsp;&nbsp; WebBrowser bile\u015feni Document \u00f6zelli\u011fi i\u00e7erisinde yer alan <strong>DomDocument<\/strong> \u00f6zelli\u011fi istedi\u011fimiz \u015fekilde d\u00fczenlenebilir bir kontrole sahip olma noktas\u0131nda giri\u015f noktam\u0131z olacakt\u0131r. Arkaplanda kullan\u0131lan unmanaged bile\u015feni g\u00f6steren ve bir nesne veren bu \u00f6zellik, arkada yap\u0131lanlar\u0131 ve kullan\u0131lmas\u0131 gereken aray\u00fczleri bilmeniz durumunda olduk\u00e7a i\u015finize yarayacakt\u0131r. <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa752574(v=vs.85).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">mshtml.IHTMLDocument2 <\/a>aray\u00fcz\u00fcnde olan bu de\u011fi\u015fkeni i\u00e7erisinde yer alan <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa752573(v=vs.85).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">designMode<\/a> de\u011ferinin string &#8220;On&#8221; yap\u0131lmas\u0131 ile birlikte art\u0131k i\u00e7eri\u011fimiz d\u00fczenlenebilir olacakt\u0131r. Bunu yapabilmenin ilk yolu bu aray\u00fcz\u00fcn bulundu\u011fu bir ActivX wrapper&#8217;\u0131 olu\u015fturarak DomDocument \u00f6zelli\u011fini aray\u00fcze cast etmek ve ard\u0131ndan da designMode \u00f6zelli\u011fine &#8220;On&#8221; de\u011ferini atamakt\u0131r. Bu y\u00f6ntemdeki s\u0131k\u0131nt\u0131 ilgili wrapper&#8217;\u0131 olu\u015fturmak ve her deployda istemcinize bu wrapper&#8217;\u0131 da g\u00f6ndermek zorunda olman\u0131z. Gerekmedi\u011fi s\u00fcrece bu tarz bir i\u015fe girmeyi sevmedi\u011fimde, benimle benzer d\u00fc\u015f\u00fcncede olanlar i\u00e7in, ikinci bir alternatifi sizinle payla\u015fmak istiyorum; bu de\u011fi\u015fkene reflection \u00fczerinden eri\u015ferek de\u011ferini de\u011fi\u015ftirmemiz de m\u00fcmk\u00fcn;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var domDocument = webBrowser.Document.DomDocument;\nvar designModeProperty = domDocument.GetType().GetProperty(\"designMode\");\n\ndesignModeProperty.SetValue(domDocument, \"On\", null);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Herhangi bir ek assembly ve ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olmad\u0131\u011f\u0131 i\u00e7in tercih etti\u011fim ikinci y\u00f6ntem d\u0131\u015f\u0131ndaki \u00fc\u00e7\u00fcnc\u00fc alternatifimiz ise \u00e7ok daha kolay; <strong>IHTMLElement3<\/strong> aray\u00fcz\u00fc ile birlikte bize sunulan <strong><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/aa703944(v=vs.85).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">contentEditable<\/a><\/strong> \u00f6zelli\u011fini kullanmak. \u0130\u015fletim sisteminde Internet Explorer 8 ve \u00fcst\u00fc bir web browser&#8217;\u0131n kurulu olmas\u0131n\u0131 gerektiren bu alternatifte sayfam\u0131z \u00fczerindeki bir bile\u015feni (\u00f6rne\u011fin bir div&#8217;i) d\u00fczenlenebilir yapabiliyoruz. Bu \u00f6zelli\u011fe body elementi i\u00e7in true de\u011ferinin atanmas\u0131 WebBrowser bile\u015fenine aksi belirtilmedi\u011fi s\u00fcrece t\u00fcm sayfan\u0131n d\u00fczenlenebilir olaca\u011f\u0131n\u0131 anlatacakt\u0131r. Html dok\u00fcman\u0131 \u00fczerindeki body elementine bu \u00f6zelli\u011fi atamak de\u011ferini de\u011fi\u015ftirmek i\u00e7in yukar\u0131da sizinle payla\u015ft\u0131\u011f\u0131m Document \u00f6zelli\u011fi alt\u0131ndaki alt \u00f6zellikleri kullanarak yapabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">webBrowser.Document.Body.SetAttribute(\"contenteditable\", \"true\");<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu y\u00f6ntem ile ilgili bilinmesi gereken \u00f6nemli bir nokta sayfan\u0131n i\u00e7eri\u011fine m\u00fcdahale edildi\u011fidir. Dolay\u0131s\u0131yla sayfa bu haliyle saklanacak olursa destekleyen web taray\u0131c\u0131lar\u0131 i\u00e7erisinde de d\u00fczenleme yap\u0131labilir \ud83d\ude42<\/p>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131da s\u0131ralad\u0131\u011f\u0131m ad\u0131mlar ard\u0131ndan Html dok\u00fcman\u0131m\u0131z\u0131 WebBrowser bile\u015feni \u00fczerinden d\u00fczenlenebilir hale getirdik; ama \u015fimdiye kadar yapt\u0131klar\u0131m\u0131zla mevcut yaz\u0131lar\u0131 de\u011fi\u015ftirmek ya da i\u00e7eri\u011fi silme gibi i\u015flemler yap\u0131labilmekte. Ger\u00e7ek bir Html edit\u00f6r\u00fcnde kes, yap\u0131\u015ft\u0131r, geri al, t\u00fcm\u00fcn\u00fc se\u00e7 v.b. komutlar\u0131n \u00e7al\u0131\u015ft\u0131r\u0131labilir olmas\u0131, se\u00e7ili olan bile\u015fen hakk\u0131ndaki bilgileri alabiliyor olmam\u0131z gerekli. \u015eimdi isterseniz birlikte bunlar\u0131 nas\u0131l yapabilece\u011fimizi g\u00f6relim;<\/p>\n\n\n\n<p>&nbsp;&nbsp; WebBrowser bile\u015fenine y\u00fckledi\u011fimiz bir html dok\u00fcman\u0131 \u00fczerinden kes, kopyala, geri al v.b. i\u015flemleri yapt\u0131rmak i\u00e7in gerekli parametreleri de vererek do\u011fru komutlar\u0131 g\u00f6ndermemiz gerekli. Bu komutlar\u0131m\u0131z\u0131 g\u00f6ndermek i\u00e7in Document \u00f6zelli\u011fi i\u00e7erisine yerle\u015ftirilmi\u015f olan <strong>ExecCommand<\/strong> fonksiyonu kullan\u0131lmal\u0131d\u0131r. Parametre olarak komut ad\u0131, aray\u00fcz g\u00f6sterilip g\u00f6sterilmeyece\u011fi ve komuta g\u00f6nderilecek de\u011feri vererek kullanabilece\u011finiz ExecCommand komutuna ait \u00f6rnek kullan\u0131mlar\u0131 a\u015fa\u011f\u0131da bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/se\u00e7ili metin'i k\u0131rm\u0131z\u0131 yapar\nwebBrowser.Document.ExecCommand(\"ForeColor\", false, \"red\");\n\n\/\/ verilen id ile bir buton olu\u015fturur\nwebBrowser.Document.ExecCommand(\"InsertButton\", false, \"buton1\");\n\n\/\/son i\u015fleri geri al\u0131r\nwebBrowser.Document.ExecCommand(\"Undo\", false, null);\n\n\/\/geri al\u0131nan i\u015fleri yeniden yapar\nwebBrowser.Document.ExecCommand(\"Redo\", false, null);\n\n\/\/Se\u00e7ili metini keser\nwebBrowser.Document.ExecCommand(\"Cut\", false, null);\n\n\/\/se\u00e7ili metini kopyalar\nwebBrowser.Document.ExecCommand(\"Cpoy\", false, null);\n\n\/\/haf\u0131zada bulunan veriyi yap\u0131\u015ft\u0131r\u0131r\nwebBrowser.Document.ExecCommand(\"Paste\", false, null);<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Geni\u015f bir yelpazede komut k\u00fct\u00fcphanesine sahip olan WebBrowser bile\u015feninde kullanabilece\u011finiz t\u00fcm komutlar ile bu komutlar\u0131n parametrelerine <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms533049(v=vs.85).aspx\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/msdn.microsoft.com\/en-us\/library\/ms533049%28v=vs.85%29.aspx<\/a> adresinden ula\u015fabilirsiniz.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Html dok\u00fcman\u0131na komut g\u00f6ndermeyi de ba\u015fard\u0131ktan sonra yapmam\u0131z gerekenler iyice azald\u0131. Bir Html edit\u00f6r\u00fc se\u00e7ili olan bile\u015fen hakk\u0131nda bilgi de verebilmeli ya da en az\u0131nda destekledi\u011fi komutlara g\u00f6re aray\u00fcz\u00fcn\u00fc g\u00fcncelleyebilmeli, \u00f6rne\u011fi; bir resim se\u00e7ili ile kal\u0131nla\u015ft\u0131r (bold) butonunun aktif olmamas\u0131 gerekli.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Bu i\u015flevselli\u011fi destekleyebilmek i\u00e7in \u00f6ncelikle edit\u00f6r\u00fcm\u00fczde aktif olarak se\u00e7ili bile\u015fenin de\u011fi\u015fti\u011finden haberdar olmam\u0131z gerekli. Bunu yapabilmek i\u00e7in Document \u00f6zelli\u011fi alt\u0131nda bulunan <strong>AttachEventHandler<\/strong> fonksiyonu kullan\u0131larak se\u00e7im de\u011fi\u015fti\u011finde bir fonksiyonumuzun tetiklenmesini sa\u011flayabiliriz. AttachEventHandler fonksiyonu takip edilecek olan olay ad\u0131n\u0131 string olarak almaktad\u0131r, bizim \u00f6rne\u011fimiz i\u00e7in kullan\u0131lmas\u0131 gereken de\u011fer <strong>onselectionchange<\/strong>&#8216;dir.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">webBrowser.Document.AttachEventHandler(\"onselectionchange\", webBrowser_SelectionChange);\n\nprivate void webBrowser_SelectionChange(object sender, EventArgs e) {\n    \/\/ Se\u00e7ili bile\u015fen de\u011fi\u015fti\n    \/\/ ilgili komutlar\u0131n durumlar\u0131 kontrol edilerek\n    \/\/ aray\u00fcz g\u00fcncellenmeli\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Art\u0131k aktif kontrol\u00fc de\u011fi\u015fti\u011finden haberdar\u0131z, s\u0131rada aray\u00fcz bile\u015fenlerimizin durumlar\u0131n\u0131 g\u00fcncellemek var. Bunu i\u00e7in yap\u0131lmas\u0131 gereken her bir komut i\u00e7in durum sorgusu yaparak se\u00e7ili bile\u015fen i\u00e7in desteklenip desteklenmedi\u011fine g\u00f6re aktif\/pasif&nbsp; hale getirmektir. Durum sorgulama fonksiyonumuz, ayn\u0131 tasar\u0131m moduna ge\u00e7memizi sa\u011flayan designMode de\u011feri gibi, DomDocument \u00f6zelli\u011fi i\u00e7erisindedir; <strong>queryCommandState<\/strong>. Parametre olarak durumu sorgulanmas\u0131 istenen komutu vermeniz gereken bu fonksiyon size yan\u0131t olarak desteklenmesi durumunda true, aksi hallerde false de\u011feri d\u00f6necektir. queryCommandState fonksiyonuna benzer \u015fekilde aktif dok\u00fcman\u0131n de\u011ferinin sorgulanmas\u0131 da m\u00fcmk\u00fcnd\u00fcr. Bu durumda kullan\u0131lmas\u0131 gereken komut ise <strong>queryCommandValue<\/strong> fonksiyonudur. A\u015fa\u011f\u0131da reflection ile s\u0131k\u00e7a yap\u0131lacak olan ve bu iki komutu kullanmam\u0131z\u0131 sa\u011flayan kodlar\u0131 bulabilirsiniz. Bu kodlar\u0131 kullan\u0131m kolayl\u0131\u011f\u0131 olmas\u0131 ad\u0131na bir geni\u015fleme (extension) fonksiyon olarak tan\u0131mlayarak haz\u0131rlayarak a\u015fa\u011f\u0131da sizlerle payla\u015f\u0131yorum;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public static class HtmlDocumentExtensions {\n    public static object queryCommandValue(this HtmlDocument document, string komut) {\n        var domDocument = document.DomDocument;\n        var queryCommandValueMethod = domDocument.GetType().GetMethod(\"queryCommandValue\");\n\n        return queryCommandValueMethod.Invoke(domDocument, new[] { komut });\n    }\n\n    public static bool queryCommandState(this HtmlDocument document, string komut) {\n        var domDocument = document.DomDocument;\n        var queryCommandValueMethod = domDocument.GetType().GetMethod(\"queryCommandState\");\n\n        return (bool)queryCommandValueMethod.Invoke(domDocument, new[] { komut });\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu geni\u015fleme fonksiyonlar\u0131n\u0131 a\u015fa\u011f\u0131daki \u015fekilde kullanabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var fontAdi = webBrowser.Document.queryCommandValue(\"FontName\");\n\nvar geriAlDestekliyorMu = webBrowser.Document.queryCommandState(\"Redo\");<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; \u015eimdiye kadar sizlerle payla\u015ft\u0131\u011f\u0131m bilgilerle uygulaman\u0131zda sundu\u011funuz web sayfalar\u0131 ile \u00e7ift y\u00f6nl\u00fc ileti\u015fim kurabilir, bir Html edit\u00f6r\u00fc haz\u0131rlayabilirsiniz. Bile\u015fen taraf\u0131ndan bize sunulan kes, kopyala, yap\u0131\u015ft\u0131r, geri al v.b. komutlar baz\u0131 ileri kullan\u0131mlarda ihtiya\u00e7lar\u0131n\u0131z\u0131 tam anlam\u0131yla kar\u015f\u0131layamayabilir. Bu gibi durumlarda javascript bilginizi de kullanarak dok\u00fcman i\u00e7erisine bir script enjekte edebilir, ard\u0131ndan da InvokeScript fonksiyonu ile bunlar\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz. Bu y\u00f6ntemin de i\u015fe yaramad\u0131\u011f\u0131 durumlarda ise do\u011frudan Html DOM&#8217;una m\u00fcdahale ederek string olarak olu\u015fturaca\u011f\u0131n\u0131z html i\u00e7eri\u011fine DOM&#8217;a ekleyebilirsiniz (<em>\u00f6rne\u011fin ilgili element i\u00e7erisindeki <strong>innerHTML<\/strong> \u00f6zelli\u011fini kullanarak<\/em>). Net Framework WebBrowser bile\u015feni arkaplanda ActiveX bile\u015fenleri kullan\u0131yor olmas\u0131 nedeniyle s\u0131k s\u0131k tak\u0131laca\u011f\u0131n\u0131z bir durumla kar\u015f\u0131la\u015fabilirsiniz. Bu durumlarda MSDN sitesi \u00fczerinde bulunan dok\u00fcmanlar yard\u0131mc\u0131n\u0131z olacakt\u0131r. Bu dok\u00fcmanlar\u0131n tek s\u0131k\u0131nt\u0131s\u0131 managed kod i\u00e7in yaz\u0131lmam\u0131\u015f olduklar\u0131ndan dolay\u0131 uygulamaya ge\u00e7irirken sizleri u\u011fra\u015ft\u0131rabilecek olmalar\u0131d\u0131r.<\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp; Ge\u00e7ti\u011fimiz g\u00fcnlerde uzun zaman \u00f6nce geli\u015ftirdi\u011fim a\u00e7\u0131k kaynak kodlu projelerime tekrar bir g\u00f6z att\u0131m, biraz nostalji oldu bu asl\u0131na bakarsan\u0131z \ud83d\ude42 Projelerim aras\u0131nda 2003&#8217;\u00fcn ilk yar\u0131s\u0131nda geli\u015ftirmeye ba\u015flad\u0131\u011f\u0131m, son s\u00fcr\u00fcm\u00fc ise 2004 Ocak olan ve SourceForge sitesi \u00fczerinden sundu\u011fum Software Studio&#8216;nun yeri bende ayr\u0131d\u0131r, vakit bulup bu projemi devam ettirmeyi \u00e7ok isterdim. Uygulamam i\u00e7erisinde&#8230;<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/fatihboy.com\/en\/csharp-ile-html-editoru-yapiyoruz\/\">Read More<\/a><\/p>","protected":false},"author":1,"featured_media":8607,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,28],"tags":[41,119],"class_list":["post-8604","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-csharp","category-turkce","tag-c","tag-webbrowser"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz - Fatih Boy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihboy.com\/en\/csharp-ile-html-editoru-yapiyoruz\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz - Fatih Boy\" \/>\n<meta property=\"og:description\" content=\"&nbsp; Ge\u00e7ti\u011fimiz g\u00fcnlerde uzun zaman \u00f6nce geli\u015ftirdi\u011fim a\u00e7\u0131k kaynak kodlu projelerime tekrar bir g\u00f6z att\u0131m, biraz nostalji oldu bu asl\u0131na bakarsan\u0131z \ud83d\ude42 Projelerim aras\u0131nda 2003&#8217;\u00fcn ilk yar\u0131s\u0131nda geli\u015ftirmeye ba\u015flad\u0131\u011f\u0131m, son s\u00fcr\u00fcm\u00fc ise 2004 Ocak olan ve SourceForge sitesi \u00fczerinden sundu\u011fum Software Studio&#8216;nun yeri bende ayr\u0131d\u0131r, vakit bulup bu projemi devam ettirmeyi \u00e7ok isterdim. Uygulamam i\u00e7erisinde...Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihboy.com\/en\/csharp-ile-html-editoru-yapiyoruz\/\" \/>\n<meta property=\"og:site_name\" content=\"Fatih Boy\" \/>\n<meta property=\"article:published_time\" content=\"2010-12-30T21:40:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png\" \/>\n\t<meta property=\"og:image:width\" content=\"209\" \/>\n\t<meta property=\"og:image:height\" content=\"208\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Fatih Boy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Boy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/\"},\"author\":{\"name\":\"Fatih Boy\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"headline\":\"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz\",\"datePublished\":\"2010-12-30T21:40:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/\"},\"wordCount\":2213,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png\",\"keywords\":[\"C#\",\"WebBrowser\"],\"articleSection\":[\"C#\",\"T\u00fcrk\u00e7e\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/\",\"url\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/\",\"name\":\"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz - Fatih Boy\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png\",\"datePublished\":\"2010-12-30T21:40:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#primaryimage\",\"url\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png\",\"contentUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png\",\"width\":209,\"height\":208},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fatihboy.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihboy.com\/#website\",\"url\":\"https:\/\/fatihboy.com\/\",\"name\":\"Fatih Boy\",\"description\":\"Ki\u015fisel Web Sitesi\",\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihboy.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\",\"name\":\"Fatih Boy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"caption\":\"Fatih Boy\"},\"logo\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/fatihboy.com\"],\"url\":\"https:\/\/fatihboy.com\/en\/author\/fatih\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz - Fatih Boy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihboy.com\/en\/csharp-ile-html-editoru-yapiyoruz\/","og_locale":"en_US","og_type":"article","og_title":"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz - Fatih Boy","og_description":"&nbsp; Ge\u00e7ti\u011fimiz g\u00fcnlerde uzun zaman \u00f6nce geli\u015ftirdi\u011fim a\u00e7\u0131k kaynak kodlu projelerime tekrar bir g\u00f6z att\u0131m, biraz nostalji oldu bu asl\u0131na bakarsan\u0131z \ud83d\ude42 Projelerim aras\u0131nda 2003&#8217;\u00fcn ilk yar\u0131s\u0131nda geli\u015ftirmeye ba\u015flad\u0131\u011f\u0131m, son s\u00fcr\u00fcm\u00fc ise 2004 Ocak olan ve SourceForge sitesi \u00fczerinden sundu\u011fum Software Studio&#8216;nun yeri bende ayr\u0131d\u0131r, vakit bulup bu projemi devam ettirmeyi \u00e7ok isterdim. Uygulamam i\u00e7erisinde...Read More","og_url":"https:\/\/fatihboy.com\/en\/csharp-ile-html-editoru-yapiyoruz\/","og_site_name":"Fatih Boy","article_published_time":"2010-12-30T21:40:00+00:00","og_image":[{"width":209,"height":208,"url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png","type":"image\/png"}],"author":"Fatih Boy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatih Boy","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#article","isPartOf":{"@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/"},"author":{"name":"Fatih Boy","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"headline":"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz","datePublished":"2010-12-30T21:40:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/"},"wordCount":2213,"commentCount":2,"publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"image":{"@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png","keywords":["C#","WebBrowser"],"articleSection":["C#","T\u00fcrk\u00e7e"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/","url":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/","name":"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz - Fatih Boy","isPartOf":{"@id":"https:\/\/fatihboy.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#primaryimage"},"image":{"@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png","datePublished":"2010-12-30T21:40:00+00:00","breadcrumb":{"@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#primaryimage","url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png","contentUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2010\/12\/html_thumb.png","width":209,"height":208},{"@type":"BreadcrumbList","@id":"https:\/\/fatihboy.com\/csharp-ile-html-editoru-yapiyoruz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fatihboy.com\/"},{"@type":"ListItem","position":2,"name":"C# ile HTML Edit\u00f6r\u00fc Yap\u0131yoruz"}]},{"@type":"WebSite","@id":"https:\/\/fatihboy.com\/#website","url":"https:\/\/fatihboy.com\/","name":"Fatih Boy","description":"Ki\u015fisel Web Sitesi","publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihboy.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158","name":"Fatih Boy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","caption":"Fatih Boy"},"logo":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/fatihboy.com"],"url":"https:\/\/fatihboy.com\/en\/author\/fatih\/"}]}},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8604","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/comments?post=8604"}],"version-history":[{"count":0,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8604\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media\/8607"}],"wp:attachment":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media?parent=8604"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/categories?post=8604"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/tags?post=8604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}