Estoy usando ItemsControl donde el ItemsPanel se establece en Canvas (consulte la pregunta this para obtener más información de fondo). El ItemsControl está funcionando como yo quiero, y funciona como un encanto cuando se añade un elemento secundario manualmente poniéndolo en ItemsControl.Items:Al usar ItemsControl ItemsControl.ItemsPanel se establece en Canvas, ContenPresenter entra y rompe mis propiedades Canvas en los elementos secundarios [WPF]
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Items>
<Button Canvas.Left="500" Content="Button Text" />
</ItemsControl.Items>
</ItemsControl>
Nota Canvas.Left la propiedad en el botón. Esto funciona como un amuleto, y el botón se coloca a 500 píxeles de la izquierda del lado izquierdo de ItemsControl. ¡Estupendo!
Sin embargo, cuando estoy definiendo la unión a una lista de un ItemsSource, la Canvas.left no tiene ningún efecto:
<ItemsControl ItemsSource="{Binding Elements}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Canvas.Left="500" Content="Button Text" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Mediante la inspección de la aplicación en tiempo de ejecución, veo una diferencia. El contenedor ContentPresenter se ha agregado entre el lienzo y el botón.
¿Cómo puedo establecer la propiedad Canvas.Left en ContentPresenter? ¿O hay otra forma de resolver este problema?
¡Gracias a todos!
parece extraño, pero esto funcionó para mí. – bryanbcook
También puede enlazar el valor dentro de ItemContainerStyle y usará el mismo elemento que DataTemplate utiliza como fuente. :-) –
Eres mi héroe hoy. Gracias. –