Silverlight 3 - Data Binding Position of a rectangle on a canvas

前端 未结 5 2170
囚心锁ツ
囚心锁ツ 2020-12-19 13:43

I am currently trying to bind a collection of objects to a Canvas in Silverlight 3 using an ItemsControl as below:



        
相关标签:
5条回答
  • 2020-12-19 14:01

    I realize that this already has an answer accepted, but the way to achieve the initial goal without messing with margins is to create a custom ItemsControl and override the PrepareContainerForItemOverride method. In this method, you set the binding in code.

    public class CustomItemsCollection
        : ItemsControl
    {
        protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
        {
    
            FrameworkElement contentitem = element as FrameworkElement;
            Binding leftBinding = new Binding("Left"); // "Left" is the property path that you want to bind the value to.
            contentitem.SetBinding(Canvas.LeftProperty, leftBinding);
    
            base.PrepareContainerForItemOverride(element, item);
        }
    
    }
    
    0 讨论(0)
  • 2020-12-19 14:05

    Add the following to your ItemsControl

     <ItemsControl.ItemContainerStyle>
        <Style TargetType="{x:Type ContentPresenter}">
          <Setter Property="Canvas.Left" Value="{Binding XPath=XAxis}"/>
        </Style>
      </ItemsControl.ItemContainerStyle>
    

    No need for any custom controls

    0 讨论(0)
  • 2020-12-19 14:06

    You are right, a ContentPresenter is inserted between the Canvas and the Rectangle. One workaround would be to set a left margin instead of a Canvas.Left:

    <Rectangle Stroke="LightGray" Fill="Black" StrokeThickness="2" 
          RadiusX="15" RadiusY="15" Height="25" Width="25">
        <Rectangle.Margin>
            <Thickness Left="{Binding XAxis}"/>
        </Rectangle.Margin>
    </Rectangle>
    
    0 讨论(0)
  • 2020-12-19 14:07

    You cannot use ItemsControl.ItemContainerStyle in Silverlight. It doesn't exist. It exists only on a couple of leaf level classes like ListBox itself.

    0 讨论(0)
  • 2020-12-19 14:17

    I know this question is a little old, but you can just use a render transform - I'm doing something similar;

    <ItemsControl ItemsSource="{Binding Notes}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas Background="Aqua"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border Width="{Binding W}" Height="{Binding H}" BorderBrush="Navy" BorderThickness="5" CornerRadius="10">
                    <TextBlock Text="{Binding Text}"/>
                    <Border.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="0"/>
                            <TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
                        </TransformGroup>
                    </Border.RenderTransform>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    
    0 讨论(0)
提交回复
热议问题