我正在创建一个支持拖放的应用程序,我一直在尝试使用ItemsControl进行绑定,而不是默认添加我的控件。 Displayer是一个UserControl,代表我正在使用的对象。
ZExtender具有ZIndex,Top,Left等属性。下面的实现正确地适用于顶部,左侧,宽度,但ZIndex更改不会生效。我想在代码中绑定或更改ZIndex以在UI中自动更改它。如果不使用消息传递到我的页面的codeBehind,这可能吗?
<Border BorderBrush="Black" BorderThickness="2" Margin="35" HorizontalAlignment="Center" VerticalAlignment="Center">
<Canvas AutomationProperties.AutomationId="designerCanvas" Width="{Binding Root.Width}" Height="{Binding Root.Height}">
<Canvas.Background>
<ImageBrush ImageSource="/SilverlightImages/canvasBackground.png" Stretch="None" />
</Canvas.Background>
<ItemsControl ItemsSource="{Binding Containers}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<canvas> <!-- canvas is needed for the positioning to work -->
<controls:Displayer DataContext="{Binding ZExtender}"
Canvas.Top="{Binding Top}"
Canvas.Left="{Binding Left}"
Canvas.ZIndex="{Binding ZIndex}"
Width="{Binding WidthInPixels}"
Height="{Binding HeightInPixels}"
/>
</canvas>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Canvas>
</Border>
答案 0 :(得分:1)
我很惊讶Top / Left属性的工作。 Canvas查看它是Top / Left / ZIndex附加属性的直接子项。给定非UIElement对象,Canvas将项目包装在ContentPresenter中(它成为Canvas的直接子项)。因此,Canvas将查看ContentPresenter,而不是ZExtender或Displayer控件。
将创建Displayer控件并将其添加为ContentPresenter的子级。但这与Canvas无关。
通常情况下,您需要执行以下操作:
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Left}" />
<Setter Property="Canvas.Top" Value="{Binding Top}" />
<Setter Property="Canvas.ZIndex" Value="{Binding ZIndex}" />
</Style>
</ItemsControl.ItemContainerStyle>
但Silverlight 4不支持Setters中的绑定。所以你必须在后面的代码中应用绑定。最好在PrepareContainerForItemOverride。
或者您可以尝试here所述的解决方法。