From 23189c92d44152a934c42c67a7b8e8b2606ea060 Mon Sep 17 00:00:00 2001 From: KSaiSivani Date: Mon, 3 Nov 2025 19:04:51 +0530 Subject: [PATCH 1/8] UG content updated --- wpf/AI-AssistView/Open-AI.md | 164 +++++++++++++++++- .../wpf_aiassistview_openai1.png | Bin 0 -> 53190 bytes wpf/AI-AssistView/open-ai.md | 164 +++++++++++++++++- 3 files changed, 326 insertions(+), 2 deletions(-) create mode 100644 wpf/AI-AssistView/aiassistview_images/wpf_aiassistview_openai1.png diff --git a/wpf/AI-AssistView/Open-AI.md b/wpf/AI-AssistView/Open-AI.md index 4702e700b5..143d1f5153 100644 --- a/wpf/AI-AssistView/Open-AI.md +++ b/wpf/AI-AssistView/Open-AI.md @@ -208,4 +208,166 @@ Set the ViewModel as the DataContext for the AI AssistView or the parent window. {% endhighlight %} {% endtabs %} -![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai.gif) \ No newline at end of file +![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai.gif) + +## Customize Response using ViewTemplateSelector + +{% tabs %} +{% highlight C# %} + +public class AIMessage : NotificationObject, ITextMessage +{ + + private string solution; + + /// + /// Gets or sets the text to be display as the message. + /// + public string Solution + { + get + { + return this.solution; + } + set + { + this.solution = value; + RaisePropertyChanged(nameof(Solution)); + } + } + + private Author author; + + /// + /// Gets or sets the author to be display in the message. + /// + public Author Author + { + get { return author; } + set + { + author = value; + RaisePropertyChanged(nameof(Author)); + } + } + + private DateTime dateTime; + + /// + /// Gets or sets the date and time details when the message was created. + /// + public DateTime DateTime + { + get { return dateTime; } + set + { + dateTime = value; + RaisePropertyChanged(nameof(DateTime)); + } + } + + private string text; + + /// + /// Gets or sets the text to be display as the message. + /// + public string Text + { + get { return text; } + set { text = value; RaisePropertyChanged(nameof(Text)); } + } +} + +public class ViewTemplateSelector : DataTemplateSelector +{ + public DataTemplate AITemplate { get; set; } + + public override DataTemplate SelectTemplate(object item, DependencyObject container) + { + if (item is AIMessage) + { + return AITemplate; + } + return null; + } +} + +{% endhighlight %} +{% endtabs %} + +{% tabs %} +{% highlight xaml %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% endhighlight %} +{% endtabs %} + +![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai1.png) + diff --git a/wpf/AI-AssistView/aiassistview_images/wpf_aiassistview_openai1.png b/wpf/AI-AssistView/aiassistview_images/wpf_aiassistview_openai1.png new file mode 100644 index 0000000000000000000000000000000000000000..952be87c226aba4885afb65c5b4a02731724c01c GIT binary patch literal 53190 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�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
y#`UxpgU``Fy)qzkW4BhFv2&bLZRx zS5Dl;56L6Qu9nB3mRFTl@g-q@uQfEcrd{ote(r33A5gsl53d`}o5Tcrxo%90P&`?f zh$Mw!ypbOgf|}vA?2*c05MV1hH9i?#IGjS0CA+gFes-akMg=dNteXVY{=q2jEltD+ zRiUFtICq8z1c+Xei7L_~gX(`29nqEQPL?7+Ot`HPm{BD=aYQ|jEMz{iSg7w(&yu_8 z7B=2|Y@ibD@PX3fA4pfX)jCl9yO^W%giTb~9fXYk?OqH1h(JYHYCZtF!K+Z`kNd=p))UtP z8L1!DX z5~d+iK~soyB@RWYnhlMZfDjOU&3nJvtEQn7+_MfXP}64@X+VC$d*xQwxIh2JEZYl< zSkIRk;Dbf}1VLff1}+@d^A{n4*_;dU)VkNqip5Y;Id~EO9!ZgPp8ng<7v%({N^yrN zY+3=d=|~-lIFj{kHRTllG{q@|>A4H(UrF|AcKTr(_TCUmS9G7hp2>gvyUGe1V{ehj zg<@iaIWM8$NBjNhkE2X?=iWD(onEcWl6Vx<A&JC8GomWK>=5Q*q}#0OwRrpJNX4 z136+E*qVZ330oiK zmx!q;6>`d3Ul*Ee0z%&2km%Pnr}eY;LrEI?-Ru1=M8fl@!x<=&gzhq;v~;*qajg01 zQng?$_E-Qt#6}5hS@|+`=#quN}*RK2MH|Up{;Z z>1A~{{Oieow|)*wjd=>k{wBd)G}yxbKWFBDe$@Mo{;yoCx5OH~d7_hm3G1?xIf*>z z_xN)3{GOC$Vx2GEarLK5#R92EoRu8>Fo2R9)AD5Iy}wu0*9}YP!6OZW3GE*5S$~vr zD8(wu_T6JXP#)@4J8nXKx3}+dqNk|%BE2`zoh4d~m341%nuAmpVgc(uzNBHLV<1&C z%^Ax~sMbQ6a&(j;DOii2+zMKQW#o(nwkG5ccplwLn&wrSqY?A}0gNgkXa`s=wHyW z1y7#^c~Yr`D}LnoA{YAl^rTi{e?HkBq&5~uUUH7yCKS4Xqt zBfBFZF`!*D0#M_VzBIEM&-3y(REi*lno5Cq zWLN_F5`nbNeMWF3j)s(qhYf4iVjV)K_T{Xs6Vvmd_z5IfFp)+V=u=0cl^nMmVx{6) z1gUc9XlqAEy-#%3=Xd#O926*Wx%@3)Rra-Cs0zwO|M%snSzv(dfjb$%%7v=H0dN3?2Gp+}P{rQo0?f0ciF zVnEP}zF`kpO-_5YqZDZf*{z=Y#w#UE%bY~UD-stoA(N6By8CWVNn14v>HeB7J|cfc zB`Qt?4=qWPI(*_x8M#+vB;(y{i((WX1a@`1KVe^a}Q7^A&mwoP*91ADHdE0#j9Fks(Fw81!B%kE{5gM1pAE2 zwfsrUP)NfWa-*3obi@JN=q2LxD4o(@H+TyfMAImSF8TOv=ML0U)$&%auZ>32-ZL?? z1<4(3eV2Wn8q+qBSy4sMR2kvJX%^> z#vpG^bm<|wXccd(D}q9_^SzT_=u|o=yI_99;zNXZzy)him6F5<6CaIf!vPNQCw#mL zFGQVi^_ah!Dp-w>S6`v@zN{=Wz-6Ivl~66>r}QPyrne)7D4zeUo)_jqqs?q@_0Mmk z6BeJx*z>v7BP?dz9c8nxXpt>-TL&Q zo&IiHFyw@*^!LIGJ?fxhb%98r526s_m)oDqeaQWuhp3~o#8kl)I(hg5xShtuiI&;I zQ!$VM^#!?y^fTA!SsgQa2h>HxyJP7U~TBJw6#ZZ8f|0 zq4Smw0FKLMy)xJch>3Q?7pImC`UCoRE-v%i>Ie$U1|KlEQt)Z?Ud2~S^NvUos3z0d zsy7zqxx+O?0({{qGYFox; zw#1kqOnvk3*~_g47tN%JoAYvIOhcZFXkKlgcr9m)6yvfxcR*P4V)|S9T=tpeWhsMrq9GhgJfon(e zoNuqPD+rd}6AreaK`qkb#s-@~bHMT(_5Hi!2>jj4^X*>%E=n{(`l+(Mu$1(^!Mb;O z^z(R|6}xL&4Jn|@Qm^kEiL5s77A3rpaqP-@j<7N307i@q&P|W&=tgS7$lmS4Svq1V z6*^F|7>$tWXewsYfw{GXcqxV$nL=KEE3u#Nx>*=oNM=Dj6jzLR_`ejl9To)51d(T zH&!6k;(}*G+i|q{+7UZCI$E>SSD>Y(Wy%dlv}=3TNl<*+jc%54mR{5!#~J_)d+KwV zUKAGgYkuD$Z+~`RhQ$nQ=x0p$piVtWPbS+#iUPKAXdxnTTkprk$-`CgDr_pk%DX&< zmovHTX0-d1E$W=z*4<(S0)Di6oeaf3<=gtIDCt(F(@9aYh6f1YOex&&7t3jAeR%+E z-Y&N?9?Fy?m8=n}|)yp0R5fW)s%4vpTTbyOH zwL*nU^yo!JGFQD%8u+HKhsd5YRPu5GZD28&CvE~Bw(}>{C3I2TR31S9O%WPkae4Ww zeAP#KQ=E_>eSBdymJxs%T?nI*Y^nlT=>cj)*YMH&D1?BC!4n*7%yLPH8a2S09S1g6Y%VCemhH0O?( zXIA;W1cW9#;2Q1{XiN0NO3(L%_2?lD;%N6|SS4-XqS&Ryaep^mr;04jQPULCIHy`7 zGu_R*f)LS$(NQ=1qjma{3U~oNeCr3p}Laz1h_3jGiDocsEZmzjJ@2h5@xZp8miZt~6TYT{13dSa#{rUF@L0cm+$&Y19*;O ziZGo}WN-WkvfbYO z>HT9Ww?kgb5z@}#-j9Ua^EIvo`)dj+#R0h;qvx$j$rnH|hEN8Z6W+PshW{MeSTM7f zDx1hf^j;bhB%ctANmKj6;_n5e_~_A(Os)>PCAL64+|V=UO3i?klrf;2et zl62y!i#9XR8~J~;&oNA%_du2l zUbDUrXViw~1Y-^(k$QJ6nxz^?rm{%;u4KI>?#0P8#x%8EM6iu|ZWt4X)yL8X)PDXWD3?$Hi&x6Nc61 z1)=?%MrAs2|GlsfO23_v{}Bhm&fXhA2=Vw+FT+R$efrX?Kk(|+&Ev*Sy^m;;Hhkdf8A3`uHq(t&!MY{q>Az^^{Cg@SXwwh zqYC^?P^0H8wN{~4+F%mn#O-~((2$o?jpHN84rp4}_OJKGek2gUoM_-H!gm6koSdtf z$KH&}d-EHDbn!ugRg)%Sets!;F}%2F7j$H2e}4|MNk;RkJ4lh<-2q``lfm1%?t-81 zyZ;LgWCFYnf8+Q;E3*r^>BxnuQ0mM8ldsud(JUVg*iGfKLGZQfKg8;Pzn`lEVMlMG zPJ=4t;=+G0$fo85x_g{aY7D$8F&4F?H4a%n`-vvd>5qJk6ltBUI*@`JR*)>3_Hex1 zuAw8h#SD-|6GLBYQxhwOzIdB zB<-_Bh5M^wx0foSJ>kaB{8Jbh1Bj*82L}n-v6C(ED&`{YH9KvuH!AQ)Y@!p}a#A_i2a7cnt*RUk>mipnBbk1&acCRCwzGO#4#q)L z#gqQ_+y!P#F{O_(Z-$)@{lUn12VT<-h3eGToH_w^7LIfX7l7Z{c@iA|nO!crz$4B( z!50CqWVi(eE=mYNrnU5I9j$zQc(Br`w@0q8Ce>|{q8;Spbxj*Xz{2(t&yue>%NUZI zNTk;li)85~rRew`b$_OU&k>U{_NATm^0&m-@O@!k*5Y-gg9V2deojllnr-@AcWTg! zy9S$`!(9;<7ed3eu$EbF-|PJqV?1h?mEmNT=>dl4#{K|kU}!7W&Iv7kIC{ssNM2f! zsK?u!C;2asOuY@PDM9mncepDS4t|Jdy7Tcx4xo{R3(C12*w|Y2^Gup{?Vs;zMc_m1 zt1^`%eXA5+E<&+|xydKHJH3-}eF_pQAG%rpd_vrPO&u;=ImnMN(KcuZ-Sio^c&ASbm=pAl zTRI3T=iSN*33T^4SHHOQSUbL^E5a+7kANg`q)ykvFD@y31pcq8<}j7KO{)2Yr!$HD z+)D8_UEG&Xx`n&)FhU+V7Ym*iFVEHU`_n(ziztI(Vt5thIqvgy7OzT$1qh;dxE{g_ zL>N(XVI&Bo%!8&g2)?#Kxg**C%%M5>FPaH2btO3ywuIrE9}`haS*40G?B`kFe@ny* zs;d+epS+{3MgjmQqD&PZcW*5+l%@>ICh3 zA}*IPzyT%;*A86oL0o(skIiYWK>$QWZCPHqt@W58`r@&3Q`JTv3eYbT&Xc>gxbmtR z(cRjgj(<3! zdLBFQR-2BZ&*dcqi``=b8st|U%f5Yypd}tJq#>&DpD-=3z?mUFx>RXt>59sqffOW*V zZ<5-M-5%U?&N$&E(pXWFnTiFIaB;@6qt^Um`Sy(5i6ea$bdLm(BIph9(c;HLy zJoSRg#aFm)B`&tgq;ixZZ!v_j9(FL&4~5sIOipo4+E? zxI2a*;l}m7k9|{yr}FoPURId+Is~TB!-gM2NJK*#nO|G}`qW)HmVD#-rL#T@C?HBx zRhdQ3&-%}nI6OYYm}z1pu0VNKf2ucA`a3nkRh`9TESLqU*D_I>*E!v95Qg%_9m}3kT{5NbAnk3=M=e%ou@Ru*;!jiZtZvXvqr(<49j0ZwhzNuX`{i+$c6M{TFdOS6?M4a#+@v5_6e-~=@z11`W1{`Xfq-ej`e%E-C0Y zp4s07b!Z2+@v2Tx<5v%z?M|AlUw7W3Jm?DHoffpPS(Jfi^?OFNCJk!M@JO4nEat(F z%mup%vaJk8EQH({uP!h5`+5x;4S+k*?#RElPw@`gS9kiI5L?OswU3qzhzAYC@J;jn z{$G$WEnbLh`mH8s0CRof8urcj(n3Wd3TT2}q-kyb^##5QT#q_awl@ye^BNISpLm(Q)RfmQ@5d(>0%={y(?`p! zs4rlWKV;ugh1b^dgfob=5m*cyJGMIKQHT2@1K}82aRs8E2%FV%?7n|G38WJIg3i|T zBC)K@c{K}kl*j=$*~pd6MryWgW~1?Wu|dYm*E)4N+O!^F<&s#uJ==yHDG~yeqsGJB z>A;32Brx+WmTISHe*>d~q->|sW5(oN>`-_?9_!(Z&ZD8)#VgyrU&9km;;(&#{oLTl zJ9FZ){~0nipYbh@vYZd^65`&zYZT#_%ox~CifKOktsAgafEJg__@TB`c$o^6U)8A* zd!q75y)1jCvA%&eOWyGAEAOD}Kr@3VQsBD(vB|#|pvp~9I{`dNb7uIve|H@xBOVaH z*L1z?RpYoRJvBA8BZvTqEXHhVVAvre)dix6ciQQG9xd$Q@=4MRc;O_nmJ5GsxAsiD zu*rWf1oa9oRf$~1$Bayfo9EQ=e#J0pv08A|c}+7~Yz;xEfwR22L%La>{fGZ_8tf;5 z29KG2#%nmCvREO^#7v!V=-k`=!cuweyg(C>Cw)P3!=q#*NaxU|X?N@M+8IGl8D1D| zF_H+OerTeDb6o??>iIqyLiVrpT`?T&Zn{xx)!!M4-3`chaD6@9cfD~xd0cSVhA;43 z1PNDL7j64g6R5+(kZ-?Nw%4i%bvKsnwAHs$Br?c}K2BNKFHmrRr~jRfjEvy@9(LFy z2jo@7COS?z2?Xg=&KI{zLhZUsdazh~PBjXnmb(MR>-_JC1VjWopI(+a#4#u&XbiSt zC}+}w5*K@Oi%fT4e63Cyp zHL?3PUGNl7VXd>AOMT^T++R~zg(SnDxGnw!7*O1SjCx_g3SU#xT2SyFH(Sc<$34yO zHdqt8=v{Y-1HbLX@luW_I!rVKLS(W>}4slDhD6rnS zZtE8uSj%=s4LIKq)+j{BCXXlZ&8!+phw6s*21lni&=Sb?Si9&CCs#li#`r42X6!}I& zk_P;Z2rsQn9(6wM(AnLcr~3xTuK^y9e3AfIT*|d+D2H{6KUF27@MJ>(AvhDc`Y@*X z<@J7_*cB@aL^)gv&9zvJ;_r@Pp)x*A)%R%a{HOqD{eAhQ{ukZ$$o}TYE-o(cKH=Hg z|2*R9{TupUHv;sT#dyYfK@BoG!J2i(%)k)YaJX0z;N#($HIbMGr=J5%ReBFS-4~1nV?$yu7H-uBHt1Ew*{k%YrGZji;8Z5ACaTP^52JT#% zzaMrC9Yu}oE*Zler=yxy$c`~gav%IQ06a(t?R&8z<#(jhu6}W_Ck^*r82)~(>ndP4UX7N3-y-L$p@Ge1J6DoD zC6mLNk02%IZ+nD~m0O+jDzS{AdmDX^Ml|u1JAywLFnNSb9{vOvR&VAr0)PWB`;|;H zTp&KpLk9%((x{klEB(<$^aJEU?}-w=!X|S0WXt=y*Q@uH;?_^Ymh~FqsS*z8-Xk|N zNH&wb$_z`5Y9XRsz0Mb=a08e?K&l2ZWGqbQv-A8{V|6eS;HSp;&ev6bsuKo5_Ru^W2@Ca9j2Sxhn`ZFlw^M8-ZF9&}*7f*ddPB9FI;*s)Ukgta#$ZB#NS&{va{!NRzp zF{K0bd;3Ta3mqYx-a&ETs}EQz-UbTHhKFKXW?#|2nPkSDn>8fnOE38&04Ywga86PQ z+t{N=^lq0zc^eAyh=}sA8^kf*pE>KkTySLFd)1sHK%_vO zC7V<5O?DQiVESH_Hbk5=1McvLdY0`Gw9Zikt;HGEMz+kI*QNOAqs|=IAy~^>bdV@5 zKCM%_(U%H{4Ex0I2usM3Euq#)EICZ z54p=;NP;d8(E2`iW3SS;gVUUY+p@}W7Fl5Ez%V&uB_2j8O5FRiwDcPm4KEsrBh@>( zxxKY80Sip-(B@@Vw*g)IzyKvoZdx>VG>LIgSEYAiL$s~z*l+)!U2dNTiL7_FFB z{?oM#$?MxEuIHL=X9sLvFF^cG-P_>-iXKq*ZxC3rso-}TQHddhZ0t9`wDJO7fj{S? z4S89F>gniI@UhBtv57QKaqeu1{9)h|m1mavf_(g4ud4Cm%SR}WmaSIh;P&FBbbOH5 zuaIvkW_T}$h%fF`i(-Y@{Nt|g_$_rz`2st#-1$RvlcvIgJ{?^(0gfo@0N-q?w}clT zjV7+Ug8l)UB0lrMQX>^tt6FT2s-*=!6UO&?W zXc9&NJ_ILrZ%x=F6M5&mAdut>`@)XUj(iKn76q41;9qJrgqQ9E?=mBWn0ItEcxx7Dqr2pIiwx3X%ft}++ z3AIh+KZ@*$=RfOJ6~4{LrLuTqjjFQSOptv$Z9^iO9-y;~N*iykW?;lY!D zcQEkR6Y*{2bY7t25~(K25ej9aFZ*b;G3<8%ZxKuEk31$emhtYkgYuN!!*x%;TbAv( zB9Vy|kp`I(qrq|lt!x?Ojb#%((A{S3MPQsSQp;6Wsush-oLZco`X`89L&t!20!?^S zuW5>sg3{_$4&c635WFM#DJ^Zl1vdb+a#xu5*!t3H^}a%Bs85GK){mutbHJJPmWKrY ztbXeaT_Ut#9RE-Qp$u(KO_=@vu=bWwZGGX_AVo`yw52V@DemrCihFUF77Y+IKyfQl z++AASp|}MpEf#{iQ=9-P5@-lA;rD-M%~~_>tTi7dA2^G9?n&;k=kD{I=j?q;L?kF& zSxg)9MdfuzXD8xW>8n?-T#bP|rBf`fBAad7EY7}h4rw8csva-JSBe$Kc$(_JsdLXDyg>6Z%S+oIR|!KN=T z7d4V`78RmLrD-`F@)+Lu{?lGzJ_kq&YM4jE~bd4%s7*78?Evbcm`z5YS zpZD#6RLO(alzOPA_|YD}Qc1~fE|F?4Doc~2tjqhUwe>9!WxGO_ZuPg`B573~F7;UJ zavicsrJ?TkbCL8PU%q+?(N25$3v@<1EW;H=iUupTLSq3!<(Z}t(s9g%kFhbu-tuNK zEGB+=zbo}YS*4}r{R^BV4V&a7N@bo#0LScNcA)GX(c-&f0$gJ_@AhRo%PLjXwF-(~Lk|wr9fR(5Q-D@RlpZr_(o~NspJr zI$Sq;1J!EtAE#)E5h?1r(&(d967vDe+H7v{W za`I98OCNVMhCFe6rg^wE#JkPfgMF8uO!xA2#<%KEm@iIQZn^_Mqx>e9r^C}_)ua9e zT$_G({h;afT5mpA%{CcFnQvQ>nV&l2Wf~nh+R>4^{VrN>_k`xC z)ei=6EF_?1tQ!|<=?4bSSlP6Cu+;*}VDiXJRW*XFv0JDFuj!t7(NJB)Li(L^M9t+p=mQj518bO{xB8-2ih zoHD|O*nf{3hC^W z<3e4QZc*#=)3zCgF9=Z^do4g?!9?@xEFWS}3Vo3bu@)OF9ORY0E3eJ2rE8j66A*Ra zq5SFX`HP`qyEAhI?vW(yzKT%)&Jpt)srw|q*{{(m4Cv!oHMN4#h`O#XWz<0gb>NOi zRCq*xu842RnbK0<=t=#a_%Ax?0{ve}O*?lQgXJ|9M|s?3baw%3*rF@>l)z7Gg7`rA*1d8#P!IB~R}wo}SfHpg668`ND~h&c}3UAlISC6I&Co9z}7vFkS*ih~z5{~6Uu zv==6^@6qk>h+(3oNq)R4&k^CjNf_cMqq@v}M^tLn)sg!VF0NsC`A5fqWjCie`9P)qKY}j{Oh+ z^OF^k6*oi8HYSKQn9^cipd6Me_r6wU?CoI6_PYX$JUJQ*aK`Nyf`H1D*J-&*?zGL% zZPPx#Y4G4#$kXWBDukR4_n@A!t;lx_$dxaPXg5TX>$%4v|5IjuAd^H7qDS4>*KB7B zK|H~(UT>!4=)$EeXwU?nmDYVk87j{hGShb@(azoMXUgy2-acZWC4Es0Ic4~qaa??f z*6b=QZBSvxesQA`%q?4b7;M3rvfa1idT2HD%W6t@XtQA}e6K+9I91t~Mzj`vI3@Cv zPuh2l9Yc5ZcDZ*gDK-rW0yHC>^Lu(QO!ESBZv6O}&qJ53rgua){fcmzL#3_nyhGRz z^Lbwc9q6K5@mIuRGUVbL9m5dSF&z{*#kZU}8Eqg`9cG3zIORXI%zcX&nyITt*eEcr zY^U&aBniVT)amVTFaaxDUz@;A62`K118wPxSVO+>hG=(mm>b^q;`zubWZJI^TDoVL zX#GAL{}n0e=6Hg1bjNTrRy;s|p2aLDjxA|;=Jn9?ZSrDfkjfvQX7hMHvEOGfv7eOaU5)2<cBb{m^<=aQzT>I$;Ssd!-j7szBfiqrwn^~hS-^9r& z2p?Bqzt1KfmeN+GrAp(^OXHVuGsQW0Q3APpae=p`CAk;EK=#^`63s7jAv9I2gc(%f z`MBzwVMa>Sog+tuN8->oCOXEmkzO?4v|!d@8l`+3GBjH9ZT+xR_hH!rx<=1QCVbF& z+7F(JN(H=&8qOM5F-jI!NEfy;2;^ybS#6{=$lo8dyM)+Festinarqfd{SG6cg_n5s zrUJ*gHBW)IG3LyW5|75wB3k+Mo#ZE?Jx=WWY%WV}TAJzUMj86bq3YvK9D>9RaSVjo zI&Vob@bRx1@e_}2aBY>}&>i}2U%RhoRj0s|Z5*Yx!FRC&)ra|!^xoBzLi&Rb+%Dws zhpq3BkKKH!!ksm#A={0t*}q_pbA=@(IJai2Y>$Qa-%3M;=p~5ChzfVUc6O=61*^rT zKdmicO_cba@jSTr_4m5dI9*is(EoiM(sQg8BjG?AJsO_q`dy zNehFxDnGkjyILV?{QbnjLfT1#lsuap;f_CwCsmW-b#2?IjJJyJ^t!Wc^91AKG1dTV zYp&20Db`o@s&-ZZqKBW~=O3x6hpFS-x#wvY(c(vR6-e5}2f7&afiJ?JwWE@HrG-_J zj_3z7&bQHloo+VbtJo?5=~oSLx%#!!HMP*?<)Gs6u$S$0Sqwmy_Tz!20};H3)zjzx zZOcq|nSWS7ECo-&*l9;5=tS!32Adpt}3yog9zAzeEWY%XFbqH zxre~rEft>+vL197Fxz5V{; z5m~J+-mOC(_F}TR5-nFq=M3c#-(qWFlkN$hhonOm1J+c}JBK&Lm*3jj7l#t8hbdUnA%KPbJ z?obAHsVskW&eQ-#z=Nz?md);VQ4#l7Gd59C65M;L2eUiIghqcq&VHi#Y|JnZgV)PK zVdWaH8Qx`-$|YkcC4DoA#%?(i{jSJAg8lbJFl<|fGh=JtRyz8KJAj1Y`w(Z!JB#G6 zXu+HE9SzB#kX0vfK8Z?7i_pNg!(Wb=&uNFYZPA)fzGfn+6^|0H+P}z+aqd9`4PLYZ zrw&F}aJBghYv14&b>KBu*OYB374qogGGj8M9^`N@ywI=UXZVlL)27v#L~^7m^jncG zBA=gWy!u6RZ0I!m$XhH)PK6OOLYMq?k^Hz>VpRA?f#M4WTYS&e26V?atpEB-f&eQq z@0$LhRZp`{|CBHt{%xE%sE2fq%e?R^W&7=0s(dtIX-r8BUjR=imtpqj|*MWY%ou*O(XiwM*6#4A9ah;{eX%3YC}J8sbHFzE-O z)I350w#T1dK3G~g0V1?Q6D#UuhSR)D1m(PK=<#sOLr#u7)ju>R9;ti#7;1*Xen_s*Kj zw-E2ZgzI&FYhAcUFWjzJf0aKX$OCz`@v_d*bmTsV>>phHE~rN{A?4QFOW;miV&cP~ zc*%YI5S(Y+#V}qldp;LQK_oRkbZ^4b)#GuuRok)m@(#U6AEe2DALKAYta>3duxqtFGNLh@9M!-VX9kh!`oHw zg7Evd%;*49BNBO$t~tH zQcz};C{Q=VNmKZGVPhz#;_{$cZPZ~|{2(R!)wa3=q3uRK0_HXzd(@66 ztw(cVWDv6#&+po4MbJj07cYTGwK79s%-~e*^w(5Mb>kMh^$JpY;QRE{IYEc84p$m( zC9&$>cHU$%akzJHIcmrI__ALmiEFOya?7sVyWu(uZ{%Vn6zmzh$0JP$ZsN}ZiIHQ1 zE3nbwz>KPR>if)qh#T-opyIg45qx*SbMUtK?9Tc3y$gKJ%DVj!E8(8YGR$hQTSM*W z7d}}pe;>dcAnvtZU4-+Mx=%qa?(ribaoK0v#2vr+s)Fh6hKAJiRhk|h&$6xdGQC(N zE3|G*+Q*g;0qDPVRBQzv5k(y1*pAw!N4iDv3NgLm;qeRH%dHgCGn+NL&GfUY?J1~g zDYHO`cvc?Xj3M<5)~>hJRi%Z$JE^357yj~UMEuM!kN_W@M+Hf;%$LW4DC(N7r(9|> z=RJM+VJW^RcP9(J&!J_OMvc)U?;wzBRqk3xtI{MZ(99O?g2JZnKAl`09%5v?$7-H+OZFOEk+A7~pTlz?fSNrRfHcEZWF6NS5_|x-LJKurf7KkL1$VZ>H9zSKDSY&>s zOOs7~Hdo_>J<{ed$9c<=8m%(s2@nu(sBl@(TH};HOkZpL>Djt7U{VNx(r3ePP3uV0})>VQAOPPMGt$i5)stDo%Sa zY-?t{T=q1p)mji9rRxIOT+2SP-;$F03t$V+N=LRjcKc~0oIun?N!1<4bFGCCmgTZ# zep9ux#b7)00-lIUyhYDNuW6nHGb5;|(qRZlZ#4FH@6sALh)sJfYBnd*Tq(KySh0sO zXOeHa4Z^ zBR5QK@Jsxc)f>i?DFWvWQU^LFHE55uMA8Kt20K_ZZB>)z`Y0A8_{%*eTtu9;M2Pp*Z%6($-BsjZ7um1_Xup8#D7uhocx9!cA3 zW**6gVR1xO<|m@4UVpiTR5cu`-_Xg=2}U;XwJ4&z&j zXvpxZZb7gu?6t^ysbT0SXj9wfK)xhBYUFmpvw1zj-D6`^duj7|LwcG@iBoD0QM_C+ z;;z9sODpF!+Fd*-YLdQn^>LPWr`B^m-;u7=yxmF{)HUp$XQ14_iWB%SY{YxU92)LA zh*7>$CnA7${ImrNXoJ_PsN6UWRS+d+BCUvF{jM`;YTle8h)4R3%6jfggF>t_YC*gu z(kyz1cLyQdM`XiMe)^+dtJi6wrR`EnS=DOs_(cAj|`AP{WnaKZ?iiaJK07O*pOTB+bjo@+BNk8@n|8XHv~nf;IAZLieFy5mAs)E^fOy8fsWgw6&n99!?jXV}z^>)zx*}%*KQMXob0< z>WdJ9dPhtmqRmE0;2&|$^FFU|Fs>(hxp{5Ht@lXNgIqZ%y>pueys*PZ8x;5_#Dx2i zBy9`NDRa47yv0R6YaFhYw?g|oo8DG5g)|#|^$i5+eiUjMkJN`|>Dzc!jDsUrU55C2?L zRoCA8ea2nGYUykqSEc4tw&U+7FyPp=eUU=gHjtN)q!Flq`F1+AQm?_o16F*xt|$Sp8kAMdArTr|4hAHJc;9cBYPm>K_0I!ScItBKX*&@w6V)6D+R zi@5Pt!FRJ+rh_%j-e{_3*1v-rC7qCu8((WDu`0sJ(!=t3>YG&!mnX>zq1wmA2J&hA zLMnnHl!}irb#puU1iup=2Iz^o?B7sq{`cM3k$*~bG*p|UBKUy2_j@1)gn#Z_k28o@(EL((1p z094{jF|i?A09jtC9}X_I=8(SpCdKK7CWDSfa;IrmDlA*i=^pb!R>2B$o%zQjxH04l z_6||;sj0?e4No9J%51j7b78^)$I29J5V5mFA8w#Km~fu?Qy4wf^|;*d5)Al+voRKr z?`WQZH6m|{5bU~kvQ%(npG;vBodI+r!z-ZZ9B<2qf1VvUhIDXWGF$vIZW-fzFTD?( zyQq#o245Dr@t3k6cu{3;>AI8|2WA0jD=K7$e~e89>m`G7{{Axj z1m9BYG0_;Fqz~Yv7@XcKc{as(Nbzd%0uFO+*bVQX7WV#_)k$k)n*CnjXhm@RxHV0+ z>MOTWi|ij|w)es}#Q@NOGOGsFFnD5AAX_~K@QlEX86sem*^=rPVqU{0yG-v)EflnJ z^(CEy8zMZ~zf&hX>J3FYYe&b3Ix@1dc&#Q2e2t=VPnfd`V3}R1-FFg2+VC<5=ENM& zzio~WNdkTs-Rdrr(&*L@@;Hr$YN?Uxv6tjI=)@9TN-Z`LPe|ZL?OQruY30 zES3F~&tX6`{qd^=i^iR#8W26CoRIYDJZ{nv)_?dbDQv~Zt~IBwa|hDKH2a<6bm)Yi zt9%l$fA%_KxZH_~KOrgKy~sK*hePQjUqYABY^ChHl?$~H=}Mh77&zzs4P||C`$wVV z>90|{!mTji-xjs3G-a5Iww^%Rm~Qfg_WPx z%+s+E1>WAD_PrGb9;9Y%Ur$-2G2Rfk>nN6L*XZ9`Oj~VZkY?eONj(w?QhN0$_-XtG z1}Sk)G@scaN$^&0*}o( z!F<1|5ftaW=)$_?_^6@<`wjHo^x9;@#>ISVp7WaOz<$m5J3MqwJ*YLPV~3_>I`g`< zMHWRR%HJTx2vP1a>5z!A7u{Pmcpu)gDz)d!CFkpt9GTwNhUoo~u~@g|CzV&8I+bLQ<%f@8EohlS16nTf)B; zClN;ZYwvp;$V)0b)WO4XQDaqDWS2R~D}^78veh+?F)%i6-il<-YU{LAavE_TzEUHE zU$5=x!ZR*k;DHmak-7OlY{1fiuxeyC@@Dtl5=Hlq^6BU@8UiC!{+0&2i_&6QRP1OO z^Qy)I3p6Ujq^F0?_V7~wpPg}yTC}=tp8FTc+7mb}kP#ju2A_>rvJ(X7Pjvhll)X61j7NRM7Tg@)Is~$9eHZiZyZ9cLk%CJhEmO&XJ&f$T z2zw#7C+{8BVpy2rXdc`O^Ruo1+Q_*ud*mN@SvSQTYmJqyk6#~Zc!2CYf5gIWzH{9T zULsXznn#o&n=ub0I?rC$-xQOpI{+CN2OPBOkHXOVNXS2QBT@yvF`jzG!0pe^fgDm;>szo>r!*ZL?W1z4eo2cb=~;qz1Yb#i$B`?dCR^+ zV^^6$#&{KT!$-+^&!^C$HR-z#vkmY&?V8?6HZJ|A$~YqaVqSFTvSz01IORf$G~LQD zBjGrT()Bs5NTw_p%sxAJz2EnN*d0c}6gX|;< z#aFJ!V0S{6{i%Un{akY|pmx;@@*28Ot7B65uOxQN!GPRLaug(RGf--f`7{ilC}dP1jtX18xgN`asKe_8lkfys9|ea<)tpqXk*PR@WU> z(+Runr13nsPDr9;fs}y>?1Ve8TnASxG%&AqTr_L^I_(KWbFaOjF}=8D0ZLjO1K9RH zJ{<-Y=x9me!!-BH;~$;6XGWgLPVNmH5Ax5exD`c2YKAPER7!^j%SDNt5`%)wV;`OD88BJnz}BSb%YCu@b> z-iC;3;>N|X1V_E@7a*D@1Wmh&Y}GOkNoH|yt2RrgV%>wt5fK29NW81&j`5FN%tpk= zf^bOv_WSKX%`nRKB3sDnW#M>>xh+ux#VdXATj-1F$>T!8_;NeQB{?kgU;yaC99MlE zktt;Ly?nBa5LrLZ!MSf1bC?mt4C0CPtzETSRlI^S)h*3GWwtPeR%ef!%wL;P?Ax-e z;azy}f+GfAstaY0re`b;*penvt-4iP<}W2Ks2o~u`jH$e)POf(IuSy)qe6KLsugik z(#PeoWqdlTvk_S+f75wB5XzB^L2n%0QE>Suka1wQb$&}XYAfG{9O*o7{91=FWoLRT z@vf)1JptV{Z~FMs*AmJqGt4V)3+2e-Nz6T-tpLSL2Di-rIgw?-T~KK=Nw9L>b(oj7 z=Wuq*TDl~jL$GZbAYLn=2YBo=lDc|>$B9AmjB-?!c*#dnt|f#0@HUEQ3Q}nF-j`4G zjed!iFmrPyHH+UARkgB=(}rfY-tD?+GzAA5q~rAc7C5?w$xkbO{&69oO}ceJUpD9! zZ)u;r9cp&ZQ$xJGkQoxMR>G~6U~l=%RHC*B=Ppm8B~sjwX?bf`k(%60@{y(zPNv?8 z)Uzo^j@`QXlC%m6qwYvglR2OjW2@OGztqTvowBMT9R4f^qyW!Cs>)1EjUTpVT$LtSfc}SlvW4^6+v**mOuDSiC zfTSk6jeT@&fkxTOVjP{UZX^?zLc7I7Z!XD0H;oRWJL}ul%16dJkS8xCPnKZIMubyQ zpf=AHK`f^F1+i9UM{#x>Jl%Cj8adtkaEponIl@vp(YcISToLpG1n9P76;I?J!IAw) zu29#^mbdEEk|Ngne^m}=;qwi@-OOE z(Z15nNff0)qgJC*i4)Z8WA?`3$lBs5#KpYP&!pzS2@^+5#>PNs+Zkz>L5K5pW07cS z8s8L2b(64&24tGH-QLk&)2H4)TmN|gXlbX>lODgi$-q0+F)Exs=ei$DUbU6Q`5XtK z1nZ1FxG^jSjPMe4h1qZ{CG1r_jG#Z|5VVZ&ZgrwA^>CFWpqtA^C&G52jwufdXs4pr zIhAToYgIV1{CM z!#Gzv6+%fVI4D9kGAps547Osz`1|PnA!cWkA-zbdu zDDDq7VO3(UgechX-#I&UmX7q6@XH|_0}Ry_h>q&PswNXYjz#(&8(RXn77^Lglu*U< zs3L*TaI#in>_Z@0vo+9myVJKuEfZy)ayWt5c3kQk%g$2hI*49lHxcIhbAfw4@%t}- z!vSa#XIN;5o^8vMOg|+KhS|R#YJD!*y18;O7n$teWRC=;vg{S=N$&pZC@VOAeR0br z+^Vy)T$8HC&ITTjBd_rAI)^TbcmK5t{uo`I(;91axwQx@F>vn@N#=`{&yxvUGBbHe z633Cknfm99O9D?#1h1puZ~UQCy{pV&zNAnDzyRa*;mr5=2fB-F=YSKvb;LH*!Z)kX{@IUbuL!04*_mt34LVc zETHy}3L3h4OzYy{PZu85eUR(_iD5ej8?pRIN|=djVqW>Q-X2|mByIzv@w~t5S|_!l zAZ_~lIkVq5L;YjKrN8vzn^O5#B^?+s1ELrrlS=HEXe=9#KNbCeX(^v#<2|Gtp;!;e z>%P8~3+AKJdrnuIAjh?Pri-NMrzGdQf>&{MpxdIS)T>)V1{L;Z@xP9iy=^z)KFf+@ z@D;m#D$Vmi?p0PpJkCMh<-ob?3W)n%%lM}+R{@5)RC9pWE-9ak1Le<&%R~cn#sMp* zg>nI1e=mrpATC?D$?KFVl&0y zj1{T-;cNO=jY7B{vr7$okn_K;KM7CN=sz|#2=CM_Wu_e4%3ltw7y??Z7gJ8Yu|oT{ zJA0|)7Ac-LU*@yB`0139QAm2=EKN^#nv5e<6&fcjzJG;nh1=IdX{zDgLN=DIf>#V} zwA!95a_E*J#m4K!Z|!N~4WM@mQWkpcH8>l5$92CH;Z*(g=z>cL#3Kz3a|F_&m_etH zFf#G_`Zz!$!YVRDM6gor_sQmox=W$=8XaXue(K3^Prd`J8uPz_4*8o`KdGB}R_)w1 zmu2exozKKpFRn^etp0+_snmJDj(q>-G*D~N=bakJ4M!MGdiNjO`S~`2ljOlE9kI4z zeOEV1in`D$g)8GpOq-36&J zt3exirmJul^jT8_aDs?5g+Aqs*IDSM1I*nEfTQy90yd zjc>b~(4g0AC+6~pf5olte1Dy$doJ4&SB&B1H#Lw+@uBva`M=e_{646lQJ3=z2;*MX zQbH&o_Q(P!^g2DY$2sG#c;9&&QTW-RPJFHpz^6p2z(^Bg8Vz95sTcI|l*!et>^1cJ z{Cx3lS*WZHtY-^)$66{ID8N$5mEZAB^`vKN3IIbq`Q_6_$145Zt?W>Z)Q0bPGy9%s z5Sfza>HXm-E5)L!16I}wBzK^?eJ?frZ7~%n9mi5q$VG8nf7Oa!ZRoVP`<34gFHtvz zr6gsY)PFyBQ3cmK<^DvNEG9LJ*s#8dKB-oj*Fb&n%Ar~$&?L%VYj5w!LDsGYCOgGc z_>Dt{tCs&xucSFRu5wkCZX7i`N(svE?Pz$}D%>^tHMCf@D0hvNjz&0(wP%TUCjlS= zB9jOcSp$t-)g?p2gq9qiqmjy-J2lUlgQK>q2Kwj51sAx+lU?o^i)wxz^-N4cu3&fr zy$vogNb;dk^sMa37w^Ds3au_?OU6N?(yQHGR88NXxzx!nnk*+Faytr5E$v23AkOqg zGV1GJyL(K4!;8gj$!89&JGqPA4pLMcYz2XiI?|Tioy@?m-Bl>R4hhfYIH4#e8dCS! z!`ch!^%r|VrH|Lo~ca!we7nPQn%YJ=4wnDa%C({5W*kHj#{d42NM$tZhIO?1wm zyol4ahCwOC6IiqI6@>oCiHXi_O7Jf2U6kBiF_(=C%t9pIxq|m;7pKy zqmerBnWBxgU!2Ebbab8Q#K5U|?tN$BqUW-0|I3!22D z4OB3lzehIJ_j4;X+OMqfJkMpZxoh>VZhi;t4PKNsJ%#;vpHQ=SY&oKv5R~Uk`S%N| z$0js`pIvs5&Av-Bzl8A{Cw9}OQFwe&HB~xZ0s)<-q*}i^ry&w|ziJtewta;gwxJ5p9NNHxe zXAPfDh2dqW@%lte#P8;}#?7lXq>;8OjeFEBc;2OAVhR=4?cCrzQ2i&0KlFra9KdI@ z*6GmP)_`+{xWN0z4X%)%GvGrjMECVDxmF4x3uuIip@hAmb;eR+{x)-D!=!4ewAy0~`X zx^H}*Qbba9$@H6*SM=y_O(~Q?QYQTv`FQ%30AaZhu`&+8JqBup%rCZbf9Ib@ePmiV=B>kjtXax+Ypj$9IEwT6#8>Yo~f=VSn zJOwN4mPFiQwiVv|oFP@Wi;7w2a%t$XA9-i&i?VHBJ36gkDl+|M6{bW5_=-h;b$ydw zoXo0ewr4%_JLjP78{sX(g35?bE^7iQi9LDxSLNM(884I-8&zd6F3Jt>=fZ6ZC553u zv$!IFyXn^I$yT}<#D{jZQMO{ASGE;ysWazYdH1<${kVAQMnJFX^RKyb=V4KGW;50& z15D8AIM6RDCNX2!-Pr)#;`gAeurYOyFyE?CtmtJnZF$FZN_@{Qey{&yqEZ|3f6K=* z$s^M>3}C&be^>40TJQ=8{oKv@zMwi0l;}|o*58)hYsG>Cl@eW2L$jqz@{oPM-Azpn zM9Z$V0=Nyf%Ob{AQ;zodid$0)4N4nIN$$6dYJGlx{Yx&~hJRqlyA%eFjvRr?o_{uj z=K*>nmdDF{7n|bCyXGRbIXMD#;#=%=X*xJl1lZXf!owqSGDy()FsLNz< zs&adRY+g|j$CR0HG{WOqvNQPB1qXkozbyWanK@D+d;F*WM-iSaxEz=iH@qlED!I4U zB-Q@m^`1QF`Du9F4TeV4md64=9J9hJ zW`{|N6&hwmNBNUV`M90dluftdBhZriw61^O>h!<>gUkGK#fM`otM_+U6CD~cZ)DQe zJVvLzKi>VHPT~h3ZTXyXR0W<(ZXs8Z-~)f``%58x{{FJXoZv7Bwl3)j?_AHC>#XV6 z+X`$o>)}7RweB94?J4Ss%fHW=%T#Iw)E|#b0?B9f!237;^UJPxii}-#QBtLy(gW6t zjYJi<49&8Ps7>8LGQaQMUaS2L$~~lOWtP?j1l;5_t&Lb18WN#lM*CmgZCFe;S1rA( z_$2yCay zy4b5uc|Z0vQo|#Ca{)D)PaX$gBzkOBm^

0)=V(JlgETq1`=emD!)Bkubu^Q1KMl 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 literal 0 HcmV?d00001 diff --git a/wpf/AI-AssistView/open-ai.md b/wpf/AI-AssistView/open-ai.md index 4702e700b5..143d1f5153 100644 --- a/wpf/AI-AssistView/open-ai.md +++ b/wpf/AI-AssistView/open-ai.md @@ -208,4 +208,166 @@ Set the ViewModel as the DataContext for the AI AssistView or the parent window. {% endhighlight %} {% endtabs %} -![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai.gif) \ No newline at end of file +![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai.gif) + +## Customize Response using ViewTemplateSelector + +{% tabs %} +{% highlight C# %} + +public class AIMessage : NotificationObject, ITextMessage +{ + + private string solution; + + ///

+ /// Gets or sets the text to be display as the message. + /// + public string Solution + { + get + { + return this.solution; + } + set + { + this.solution = value; + RaisePropertyChanged(nameof(Solution)); + } + } + + private Author author; + + /// + /// Gets or sets the author to be display in the message. + /// + public Author Author + { + get { return author; } + set + { + author = value; + RaisePropertyChanged(nameof(Author)); + } + } + + private DateTime dateTime; + + /// + /// Gets or sets the date and time details when the message was created. + /// + public DateTime DateTime + { + get { return dateTime; } + set + { + dateTime = value; + RaisePropertyChanged(nameof(DateTime)); + } + } + + private string text; + + /// + /// Gets or sets the text to be display as the message. + /// + public string Text + { + get { return text; } + set { text = value; RaisePropertyChanged(nameof(Text)); } + } +} + +public class ViewTemplateSelector : DataTemplateSelector +{ + public DataTemplate AITemplate { get; set; } + + public override DataTemplate SelectTemplate(object item, DependencyObject container) + { + if (item is AIMessage) + { + return AITemplate; + } + return null; + } +} + +{% endhighlight %} +{% endtabs %} + +{% tabs %} +{% highlight xaml %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% endhighlight %} +{% endtabs %} + +![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai1.png) + From 3046c6b490bf866a8981bc8ca62aa1d5b81c3d82 Mon Sep 17 00:00:00 2001 From: KSaiSivani Date: Mon, 3 Nov 2025 19:21:08 +0530 Subject: [PATCH 2/8] updated --- wpf/AI-AssistView/Open-AI.md | 2 +- wpf/AI-AssistView/open-ai.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wpf/AI-AssistView/Open-AI.md b/wpf/AI-AssistView/Open-AI.md index 143d1f5153..f72a36ec51 100644 --- a/wpf/AI-AssistView/Open-AI.md +++ b/wpf/AI-AssistView/Open-AI.md @@ -369,5 +369,5 @@ public class ViewTemplateSelector : DataTemplateSelector {% endhighlight %} {% endtabs %} -![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai1.png) +![WPF AI AssistView control ViewTemplateSelector](aiassistview_images/wpf_aiassistview_openai1.png) diff --git a/wpf/AI-AssistView/open-ai.md b/wpf/AI-AssistView/open-ai.md index 143d1f5153..f72a36ec51 100644 --- a/wpf/AI-AssistView/open-ai.md +++ b/wpf/AI-AssistView/open-ai.md @@ -369,5 +369,5 @@ public class ViewTemplateSelector : DataTemplateSelector {% endhighlight %} {% endtabs %} -![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai1.png) +![WPF AI AssistView control ViewTemplateSelector](aiassistview_images/wpf_aiassistview_openai1.png) From cf52557e2b1d9974d04f154b98c5168511e6d60d Mon Sep 17 00:00:00 2001 From: KSaiSivani Date: Mon, 3 Nov 2025 20:12:44 +0530 Subject: [PATCH 3/8] Update Input-Toolbar.md --- wpf/AI-AssistView/Input-Toolbar.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wpf/AI-AssistView/Input-Toolbar.md b/wpf/AI-AssistView/Input-Toolbar.md index 21250281fa..e83205cffa 100644 --- a/wpf/AI-AssistView/Input-Toolbar.md +++ b/wpf/AI-AssistView/Input-Toolbar.md @@ -38,7 +38,7 @@ Use the ItemTemplate property to define the appearance and behavior of each tool From 38067641f541cbccdcfd63fd59ed2474c0359f1b Mon Sep 17 00:00:00 2001 From: KSaiSivani Date: Tue, 4 Nov 2025 14:57:43 +0530 Subject: [PATCH 4/8] updated --- wpf/AI-AssistView/Open-AI.md | 2 +- wpf/AI-AssistView/open-ai.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wpf/AI-AssistView/Open-AI.md b/wpf/AI-AssistView/Open-AI.md index f72a36ec51..51cbe44b95 100644 --- a/wpf/AI-AssistView/Open-AI.md +++ b/wpf/AI-AssistView/Open-AI.md @@ -1,6 +1,6 @@ --- layout: post -title: TypingIndicator in WPF AI AssistView control | Syncfusion +title: Open-AI in WPF AI AssistView control | Syncfusion description: Learn about how to connect the AI AssistView control with OpenAI and chat gpt conversation experience. platform: wpf control: SfAIAssistView diff --git a/wpf/AI-AssistView/open-ai.md b/wpf/AI-AssistView/open-ai.md index f72a36ec51..51cbe44b95 100644 --- a/wpf/AI-AssistView/open-ai.md +++ b/wpf/AI-AssistView/open-ai.md @@ -1,6 +1,6 @@ --- layout: post -title: TypingIndicator in WPF AI AssistView control | Syncfusion +title: Open-AI in WPF AI AssistView control | Syncfusion description: Learn about how to connect the AI AssistView control with OpenAI and chat gpt conversation experience. platform: wpf control: SfAIAssistView From c54f4966857b36b273d08cfc383e28f06114b8d4 Mon Sep 17 00:00:00 2001 From: KSaiSivani Date: Tue, 4 Nov 2025 15:16:17 +0530 Subject: [PATCH 5/8] Update Input-Toolbar.md --- wpf/AI-AssistView/Input-Toolbar.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wpf/AI-AssistView/Input-Toolbar.md b/wpf/AI-AssistView/Input-Toolbar.md index e83205cffa..075899adb2 100644 --- a/wpf/AI-AssistView/Input-Toolbar.md +++ b/wpf/AI-AssistView/Input-Toolbar.md @@ -1,7 +1,7 @@ --- layout: post title: Input Toolbar in WPF AI AssistView control | Syncfusion -description: Learn about the input toolbar feature in the AI AssistView control, which enables users to access quick actions to input textbox responses through toolbar items. +description: The input toolbar in AI AssistView offers quick actions via toolbar items to streamline textbox response entry. platform: wpf control: SfAIAssistView documentation: ug From c838b16dd5aefc5dfd582bb22387344bad87cbc2 Mon Sep 17 00:00:00 2001 From: KSaiSivani Date: Tue, 4 Nov 2025 15:26:21 +0530 Subject: [PATCH 6/8] updated --- wpf/AI-AssistView/Open-AI.md | 4 +++- wpf/AI-AssistView/open-ai.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/wpf/AI-AssistView/Open-AI.md b/wpf/AI-AssistView/Open-AI.md index 51cbe44b95..350b92eda2 100644 --- a/wpf/AI-AssistView/Open-AI.md +++ b/wpf/AI-AssistView/Open-AI.md @@ -210,7 +210,9 @@ Set the ViewModel as the DataContext for the AI AssistView or the parent window. ![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai.gif) -## Customize Response using ViewTemplateSelector +## Customize AI Response Rendering with ViewTemplateSelector in SfAIAssistView + + ViewTemplateSelector allows you to control how AI responses are visually rendered in SfAIAssistView. By assigning a custom DataTemplate, you can format messages using markdown, HTML, or other visual layouts to enable rich, styled content in the message view. {% tabs %} {% highlight C# %} diff --git a/wpf/AI-AssistView/open-ai.md b/wpf/AI-AssistView/open-ai.md index 51cbe44b95..350b92eda2 100644 --- a/wpf/AI-AssistView/open-ai.md +++ b/wpf/AI-AssistView/open-ai.md @@ -210,7 +210,9 @@ Set the ViewModel as the DataContext for the AI AssistView or the parent window. ![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai.gif) -## Customize Response using ViewTemplateSelector +## Customize AI Response Rendering with ViewTemplateSelector in SfAIAssistView + + ViewTemplateSelector allows you to control how AI responses are visually rendered in SfAIAssistView. By assigning a custom DataTemplate, you can format messages using markdown, HTML, or other visual layouts to enable rich, styled content in the message view. {% tabs %} {% highlight C# %} From a621bc28b76912bbd92e5f2149d2ca52a9ff8117 Mon Sep 17 00:00:00 2001 From: Manivannan-E <92844213+Manivannan-E@users.noreply.github.com> Date: Tue, 4 Nov 2025 16:15:09 +0530 Subject: [PATCH 7/8] Update Open-AI.md --- wpf/AI-AssistView/Open-AI.md | 173 ++++++++++++++++++----------------- 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/wpf/AI-AssistView/Open-AI.md b/wpf/AI-AssistView/Open-AI.md index 350b92eda2..9eaa78f67b 100644 --- a/wpf/AI-AssistView/Open-AI.md +++ b/wpf/AI-AssistView/Open-AI.md @@ -211,95 +211,16 @@ Set the ViewModel as the DataContext for the AI AssistView or the parent window. ![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai.gif) ## Customize AI Response Rendering with ViewTemplateSelector in SfAIAssistView +Use the [ViewTemplateSelector](https://help.syncfusion.com/cr/wpf/Syncfusion.UI.Xaml.Chat.SfAIAssistView.html#Syncfusion_UI_Xaml_Chat_SfAIAssistView_ViewTemplateSelector) property to assign a DataTemplateSelector that controls how messages (including AI responses) are rendered in SfAIAssistView. The selector can return different DataTemplates based on the message type or role (user/assistant/system), enabling rich presentations such as: +- Markdown (via a Markdown viewer like MdXaml) +- FlowDocument-based layouts +- Images and custom visuals +- HTML (via a WebBrowser control or third-party HTML renderer) - ViewTemplateSelector allows you to control how AI responses are visually rendered in SfAIAssistView. By assigning a custom DataTemplate, you can format messages using markdown, HTML, or other visual layouts to enable rich, styled content in the message view. - -{% tabs %} -{% highlight C# %} - -public class AIMessage : NotificationObject, ITextMessage -{ - - private string solution; - - /// - /// Gets or sets the text to be display as the message. - /// - public string Solution - { - get - { - return this.solution; - } - set - { - this.solution = value; - RaisePropertyChanged(nameof(Solution)); - } - } - - private Author author; - - /// - /// Gets or sets the author to be display in the message. - /// - public Author Author - { - get { return author; } - set - { - author = value; - RaisePropertyChanged(nameof(Author)); - } - } - - private DateTime dateTime; - - /// - /// Gets or sets the date and time details when the message was created. - /// - public DateTime DateTime - { - get { return dateTime; } - set - { - dateTime = value; - RaisePropertyChanged(nameof(DateTime)); - } - } - - private string text; - - /// - /// Gets or sets the text to be display as the message. - /// - public string Text - { - get { return text; } - set { text = value; RaisePropertyChanged(nameof(Text)); } - } -} - -public class ViewTemplateSelector : DataTemplateSelector -{ - public DataTemplate AITemplate { get; set; } - - public override DataTemplate SelectTemplate(object item, DependencyObject container) - { - if (item is AIMessage) - { - return AITemplate; - } - return null; - } -} - -{% endhighlight %} -{% endtabs %} +This approach lets you tailor the appearance of assistant messages without modifying your data model. {% tabs %} {% highlight xaml %} - -{% endhighlight %} +{% endhighlight %} +{% highlight C# %} + +public class ViewTemplateSelector : DataTemplateSelector +{ + public DataTemplate AITemplate { get; set; } + + public override DataTemplate SelectTemplate(object item, DependencyObject container) + { + if (item is AIMessage) + { + return AITemplate; + } + return null; + } +} + +public class AIMessage : NotificationObject, ITextMessage +{ + + private string solution; + + /// + /// Gets or sets the text to be display as the message. + /// + public string Solution + { + get + { + return this.solution; + } + set + { + this.solution = value; + RaisePropertyChanged(nameof(Solution)); + } + } + + private Author author; + + /// + /// Gets or sets the author to be display in the message. + /// + public Author Author + { + get { return author; } + set + { + author = value; + RaisePropertyChanged(nameof(Author)); + } + } + + private DateTime dateTime; + + /// + /// Gets or sets the date and time details when the message was created. + /// + public DateTime DateTime + { + get { return dateTime; } + set + { + dateTime = value; + RaisePropertyChanged(nameof(DateTime)); + } + } + + private string text; + + /// + /// Gets or sets the text to be display as the message. + /// + public string Text + { + get { return text; } + set { text = value; RaisePropertyChanged(nameof(Text)); } + } +} + +{% endhighlight %} {% endtabs %} ![WPF AI AssistView control ViewTemplateSelector](aiassistview_images/wpf_aiassistview_openai1.png) From 17868e81521c620c1dded252969568c259cc6473 Mon Sep 17 00:00:00 2001 From: Manivannan-E <92844213+Manivannan-E@users.noreply.github.com> Date: Tue, 4 Nov 2025 16:18:04 +0530 Subject: [PATCH 8/8] Update open-ai.md --- wpf/AI-AssistView/open-ai.md | 173 ++++++++++++++++++----------------- 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/wpf/AI-AssistView/open-ai.md b/wpf/AI-AssistView/open-ai.md index 350b92eda2..9eaa78f67b 100644 --- a/wpf/AI-AssistView/open-ai.md +++ b/wpf/AI-AssistView/open-ai.md @@ -211,95 +211,16 @@ Set the ViewModel as the DataContext for the AI AssistView or the parent window. ![WPF AI AssistView control open ai](aiassistview_images/wpf_aiassistview_openai.gif) ## Customize AI Response Rendering with ViewTemplateSelector in SfAIAssistView +Use the [ViewTemplateSelector](https://help.syncfusion.com/cr/wpf/Syncfusion.UI.Xaml.Chat.SfAIAssistView.html#Syncfusion_UI_Xaml_Chat_SfAIAssistView_ViewTemplateSelector) property to assign a DataTemplateSelector that controls how messages (including AI responses) are rendered in SfAIAssistView. The selector can return different DataTemplates based on the message type or role (user/assistant/system), enabling rich presentations such as: +- Markdown (via a Markdown viewer like MdXaml) +- FlowDocument-based layouts +- Images and custom visuals +- HTML (via a WebBrowser control or third-party HTML renderer) - ViewTemplateSelector allows you to control how AI responses are visually rendered in SfAIAssistView. By assigning a custom DataTemplate, you can format messages using markdown, HTML, or other visual layouts to enable rich, styled content in the message view. - -{% tabs %} -{% highlight C# %} - -public class AIMessage : NotificationObject, ITextMessage -{ - - private string solution; - - /// - /// Gets or sets the text to be display as the message. - /// - public string Solution - { - get - { - return this.solution; - } - set - { - this.solution = value; - RaisePropertyChanged(nameof(Solution)); - } - } - - private Author author; - - /// - /// Gets or sets the author to be display in the message. - /// - public Author Author - { - get { return author; } - set - { - author = value; - RaisePropertyChanged(nameof(Author)); - } - } - - private DateTime dateTime; - - /// - /// Gets or sets the date and time details when the message was created. - /// - public DateTime DateTime - { - get { return dateTime; } - set - { - dateTime = value; - RaisePropertyChanged(nameof(DateTime)); - } - } - - private string text; - - /// - /// Gets or sets the text to be display as the message. - /// - public string Text - { - get { return text; } - set { text = value; RaisePropertyChanged(nameof(Text)); } - } -} - -public class ViewTemplateSelector : DataTemplateSelector -{ - public DataTemplate AITemplate { get; set; } - - public override DataTemplate SelectTemplate(object item, DependencyObject container) - { - if (item is AIMessage) - { - return AITemplate; - } - return null; - } -} - -{% endhighlight %} -{% endtabs %} +This approach lets you tailor the appearance of assistant messages without modifying your data model. {% tabs %} {% highlight xaml %} - -{% endhighlight %} +{% endhighlight %} +{% highlight C# %} + +public class ViewTemplateSelector : DataTemplateSelector +{ + public DataTemplate AITemplate { get; set; } + + public override DataTemplate SelectTemplate(object item, DependencyObject container) + { + if (item is AIMessage) + { + return AITemplate; + } + return null; + } +} + +public class AIMessage : NotificationObject, ITextMessage +{ + + private string solution; + + /// + /// Gets or sets the text to be display as the message. + /// + public string Solution + { + get + { + return this.solution; + } + set + { + this.solution = value; + RaisePropertyChanged(nameof(Solution)); + } + } + + private Author author; + + /// + /// Gets or sets the author to be display in the message. + /// + public Author Author + { + get { return author; } + set + { + author = value; + RaisePropertyChanged(nameof(Author)); + } + } + + private DateTime dateTime; + + /// + /// Gets or sets the date and time details when the message was created. + /// + public DateTime DateTime + { + get { return dateTime; } + set + { + dateTime = value; + RaisePropertyChanged(nameof(DateTime)); + } + } + + private string text; + + /// + /// Gets or sets the text to be display as the message. + /// + public string Text + { + get { return text; } + set { text = value; RaisePropertyChanged(nameof(Text)); } + } +} + +{% endhighlight %} {% endtabs %} ![WPF AI AssistView control ViewTemplateSelector](aiassistview_images/wpf_aiassistview_openai1.png)