debugging - Basic WPF Layout question -


i learning wpf , trying follow sort of best practice. kind of lost @ moment, , need direction.

i creating simple app reads text file (error log) , splits individual error messages. want display these messages (stored in model object) list of messages. since list can consist of many items , want window resizeable, need a vertical scroll bar, want content wrap (i.e. no need horizontal scroll bar).

<window x:class="errorlog.ui.wpf.mainwindow"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     title="mainwindow" height="800" width="1200" loaded="window_loaded">  <stackpanel name="maincontainer">     <stackpanel orientation="horizontal" name="menu">         <button name="refresh">refresh</button>     </stackpanel>             <scrollviewer verticalscrollbarvisibility="auto">         <stackpanel name="errormessageplaceholder"></stackpanel>     </scrollviewer> </stackpanel> 

i @ moment reading file in code behind , adding stackpanel bunch of textboxes value being error message. have added mouseover effects this:

private void loaddata()     {         ierrorlogreader errorlogreader = new errorlogreader();         var errors = errorlogreader.retrieveerrors();          if (errors.count == 0)         {             textbox noerrors = new textbox();             noerrors.text = "no errors found";             errormessageplaceholder.children.add(noerrors);         }         else         {             (var = errors.count - 1; > 0; i--)             {                 textbox errormessage = new textbox();                  errormessage.isreadonly = true;                 errormessage.padding = new thickness(10);                  errormessage.text = errors[i].errormessage;                 errormessage.textwrapping = textwrapping.wrap;                  errormessage.mouseenter += errormessagemouseenter;                 errormessage.mouseleave += errormessagemouseleave;                  errormessageplaceholder.children.add(errormessage);             }         }     }      protected void errormessagemouseenter(object sender, routedeventargs e)     {         ((textbox) sender).background = brushes.antiquewhite;     }      protected void errormessagemouseleave(object sender, routedeventargs e)     {         ((textbox) sender).background = null;     } 

so first things want know is:

  • is way binding ok?
  • scroll bar coming disabled
  • is way doing mouseover effect bad?

cheers.

is way binding ok?

it might work, it's not best practice. best practice use actual data binding. first, need replace stackpanel can bound list. itemscontrol thing closest simple stackpanel, other options be, example, listbox.

<scrollviewer verticalscrollbarvisibility="auto">     <itemscontrol name="errormessagelist" /> </scrollviewer> 
private void loaddata() {     ierrorlogreader errorlogreader = new errorlogreader();     var errors = errorlogreader.retrieveerrors();      errormessagelist.itemssource = errors; } 

to specify how want error messages displayed, can set template itemscontrol:

<scrollviewer verticalscrollbarvisibility="auto">     <itemscontrol name="errormessagelist">         <itemscontrol.itemtemplate>             <datatemplate>                 <textbox isreadonly="true" ... text="{binding errormessage}" />             </datatemplate>         </itemscontrol.itemtemplate>     </itemscontrol> </scrollviewer> 

scroll bar coming disabled

you nesting scrollviewer inside stackpanel... won't work: stackpanel takes vertical space needs, scrollviewer always have enough space , never show scroll bar. need replace top-level stackpanel takes space available; dockpanel, example:

<dockpanel name="maincontainer">     <stackpanel dockpanel.dock="top" orientation="horizontal" name="menu">         <button name="refresh">refresh</button>     </stackpanel>             <scrollviewer verticalscrollbarvisibility="auto">         <stackpanel name="errormessageplaceholder"></stackpanel>     </scrollviewer> </stackpanel> 

is way doing mouseover effect bad?

that can done style , trigger instead. define following style:

<window ...>     <window.resources>         <style x:key="hovertextbox" targettype="{x:type textbox}">             <style.triggers>                 <trigger property="ismouseover" value="true">                     <setter property="background" value="antiquewhite" />                 </trigger>             </style.triggers>         </style>     </window.resources>     ... </window> 

and assign textbox inside datatemplate:

<textbox isreadonly="true" ... text="{binding errormessage}"          style="{staticresource hovertextbox}" /> 

Comments

Popular posts from this blog

asp.net - repeatedly call AddImageUrl(url) to assemble pdf document -

java - Android recognize cell phone with keyboard or not? -

iphone - How would you achieve a LED Scrolling effect? -