c# - Resizable window with ScrollViewer -


i have wpf c# application. in window want start height when opens. want allow user able resize window. window has dockpanel lastchildfill set true. has on left tree pick section see it's details, in middle seperator , on right section's details (you need last child fill space left). code looks this:

 <stackpanel>     <dockpanel lastchildfill="true" background="#344755">         <textblock text="header" background="#344755" foreground="white"/>     </dockpanel>     <dockpanel lastchildfill="true" margin="5">         <telerik:radtreeview x:name="treev">                 <telerik:radtreeview.items>                     <telerik:radtreeviewitem header="general" />                     <telerik:radtreeviewitem header="general2" />                     <telerik:radtreeviewitem header="general3" />                     <telerik:radtreeviewitem header="general4" />                 </telerik:radtreeview.items>             </telerik:radtreeview>         <separator/>         <grid >             <scrollviewer verticalscrollbarvisibility="auto">                   <itemscontrol>                           <dockpanel lastchildfill="true"  margin="5">                             <grid  >                                 <textblock text="something"></textblock>                                 <checkbox  horizontalalignment="right"/>                            </grid>                         </dockpanel>                         // , many more dock panels                    </itemscontrol>             </scrollviewer>         </grid >     </dockpanel> </stackpanel> 

this problem: if don't give second dock panel height window automatically grows bigger , scroll never shows. if give height, scroll show if user resizes window dock panel doesn't resize , doesn't seperator.

any ideas?

you need rethink layout 1 thing don't need have dock panel fill available area

here quick description of common layouts

  • stackpanel creates list of items in top down or left right arrangement

  • grid attaches item grid define sized rows , columns (uniform grid same rows , colums set equally fill available space)

  • dockpanel attaches items edges using order added , dock property, default last item set fill middle

  • canvas position items @ fixed distances edges

so given controls w,x,y,z if want w on left z on right , x & y share centre

<dockpanel>     <w dockpanel.dock="left" />     <z dockpanel.dock="right" />     <uniformgrid columns="2">         <x/>         <y/>     </uniformgrid> </dockpanel> 

if wanted w cover first 1/4 of screen , x,y & z stacked vertically on remaining 3/4 , scrollable do

<grid>     <grid.columndefintions>         <columndefintion \>         <columndefintion width="3*" \>     <grid.columndefintions>     <w/>     <scrollviewer>         <stackpanel>             <x/>             <x/>             <x/>         </stackpanel>     </scrollviewer> </grid> 

if have 1 item inside layout container container not required

a quick fiddle above code , simplfies to

<dockpanel background="#344755">     <textblock dockpanel.dock="top" text="header" foreground="white"/>     <treeview x:name="treev">         <treeviewitem header="general" />         <treeviewitem header="general2" />         <treeviewitem header="general3" />         <treeviewitem header="general4" />     </treeview>     <separator/>     <scrollviewer verticalscrollbarvisibility="auto">         <itemscontrol>             <itemscontrol.itemtemplate>                 <datatemplate>                     <checkbox  horizontalalignment="right">something</checkbox>                 </datatemplate>             </itemscontrol.itemtemplate>          </itemscontrol>     </scrollviewer> </dockpanel> 

or if don't have collection bind items control to

<dockpanel background="#344755">     <textblock dockpanel.dock="top" text="header" foreground="white"/>     <treeview x:name="treev">         <treeviewitem header="general" />         <treeviewitem header="general2" />         <treeviewitem header="general3" />         <treeviewitem header="general4" />     </treeview>     <separator/>     <scrollviewer verticalscrollbarvisibility="auto">         <stackpanel>             <checkbox  horizontalalignment="right">something</checkbox>             <checkbox  horizontalalignment="right">something</checkbox>             <checkbox  horizontalalignment="right">something</checkbox>             <checkbox  horizontalalignment="right">something</checkbox>             <checkbox  horizontalalignment="right">something</checkbox>             ...          </stackpanel>     </scrollviewer> </dockpanel> 

Comments