That would work if I was only going to use this in a listbox. The reason I've gone with a Panel is that the Panel lays out its children, and I'm not locked into a Listbox. The Listbox can use a Panel for its layout (ie Canvas, StackPanel or my own Custom Panel). It seems like an important thing to be able to notify the panel that its contents have changed and it needs to redraw. How do the existing panels do it?)
I was doing this without a listbox, and then just added the items in my viewmodel property manually to the children of the FloatPanel. (couldn't bind to it as the children property of a Panel is readonly) I've also tried the FrameworkPropertyMetadataOptions.AffectsParentArrange options too with no success. I was surprised when that didn't work as it seems exactly what it was written for. I've come up with a nasty work around, i'm invalidating the layout of the FloatPanel in the ItemsPanelTemplate on mouse move when the mouse button is down. The child items should be able to notify the parent panel its layout has changed. Oh, I've also posted this on StackOverflow here http://stackoverflow.com/questions/2490285/how-to-invalidate-layout-of-listbox-from-custom-children Thanks for the reply, I may look into seeing if I can get a listboxitem style to bind to the underlaying child item (ie use your example with my Panel instead of Canvas as you suggest). Not ready to abandon my panel just yet, it does other stuff too. cheers, Stephen On Mon, Mar 22, 2010 at 2:17 PM, Paul Stovell <[email protected]>wrote: > Hi Stephen, > > > > One way to approach this, instead of custom panels, would be to use styles > and a canvas. > > > > <Style TargetType="ListBoxItem"> > > <Setter Property="Canvas.Left" Value="{Binding Path=X}" > > > <Setter Property="Canvas.Top" Value="{Binding Path=Y}" > > > > > <ListBox> > > <ListBox.ItemsPanel> > > <ItemsPanelTemplate> > > <Canvas /> > > > > The ListBox will then generate ListBoxItems and add them to the canvas, and > the canvas will get the Left and Top from the binding you set up in the > style. If calculation is needed you could use a converter in the setter. > > > > Paul > > > > > > *From:* [email protected] [mailto:[email protected]] > *On Behalf Of *Stephen Price > *Sent:* Monday, 22 March 2010 2:27 PM > *To:* ozWPF > *Subject:* customised panel wrapped in listbox > > > > Hey all, > > > > I've got a custom Panel which lays out its children based on the X, Y > properties of the children objects. It was working nicely. I then added the > custom panel to a listbox via the ItemsPanelTemplate. > > I had to modify the custom panel's arrangeoverride as the InternalChildren > were wrapped in ListboxItems. > > > > The issue I'm having now is that the items are no longer draggable. The > item' underlaying properties change when dragging so its picking up the > mouse events and changing the values. The issue seems to be that > the dependency properties used to notify the parent panel it needed to > redraw, (via the FrameworkPropertyMetadataOptions.AffectsRender parameter) > and now that its wrapped up in the listbox is no longer redrawing the custom > Panel. > > > > Hopefully I've described what i'm doing well enough that someone can tell > me how to make the panel (or its children) tell it needs to do the Layout > routines again. It works once (initial draw) but then dragging items doesn't > work (Listbox isnt aware that its children have changed and needs to > relayout.) > > > > thanks in advance! > > Stephen > > _______________________________________________ > ozwpf mailing list > [email protected] > http://prdlxvm0001.codify.net/mailman/listinfo/ozwpf > >
_______________________________________________ ozwpf mailing list [email protected] http://prdlxvm0001.codify.net/mailman/listinfo/ozwpf
