none
DataTemplate里设置元素的 Canvas.Left失效问题 RRS feed

  • 问题

  • 问题是这样的

    我有个 ItemsControl
    ItemsControl的 DataTemplate是 Ellipse
    ItemsControl的 ItemsPanelTemplate 是 Canvas
    Ellipse里的 Canvas.Left 是绑定的值,,, 但是后台改变绑定值的时候 并不能改变 Ellipse的位置..
    但加入在DataTemplate里的 Ellipse外面套一层 Canvas却可以 改变Ellipse的位置...

    下面是代码...

    <Window x:Class="WpfApplication2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication2" WindowStartupLocation="CenterScreen"
            Title="MainWindow" Height="768" Width="1024" Name="win">
        <Window.Resources>
            <local:BoolConverter x:Key="Con" />
            <DataTemplate x:Key="line">
                <Line  X1="{Binding Path=X1}" Y1="{Binding Path=Y1}" 
                               X2="{Binding Path=X2}" Y2="{Binding Path=Y2}" 
                               Stroke="{Binding Path=Stroke}" StrokeThickness="{Binding Path=Thickness}" />
            </DataTemplate>
    
            <DataTemplate x:Key="ellipse">
                <!--<Canvas>-->
                <Ellipse  Width="{Binding Path=Width}" Height="{Binding Path=Height}"  
                                Canvas.Left="{Binding  Path=Left}" Canvas.Top="{Binding Path=Top}"
                          Stroke="{Binding Path=Stroke}"      />
                <!--</Canvas>-->
            </DataTemplate>
    
            <local:ItemsControlTemplateSelector x:Key="selector" />
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="auto" />
            </Grid.RowDefinitions>
            
            <ItemsControl Name="itemsControl" ItemsSource="{Binding Path=List}"
                                  ItemTemplateSelector="{StaticResource selector}"   Background="Transparent" >
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate >
                        <Canvas Name="canvas" Background="Blue" 
                               MouseLeftButtonDown="canvas_MouseLeftButtonDown" MouseMove="canvas_MouseMove" MouseLeftButtonUp="canvas_MouseLeftButtonUp"
                                Height="{Binding ElementName=itemsControl,Path=ActualHeight}" Width="{Binding ElementName=itemsControl,Path=ActualWidth}"     >
                        </Canvas>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
    
            <Menu Grid.Row="1">
                <MenuItem Header="圆形" Click="MenuItem_Click" />
                <MenuItem Header="线" Click="MenuItem_Click" />
            </Menu>
        </Grid>
    </Window>
    


    Everyone Is NO.1

    2012年5月29日 4:22

答案

  • 自己搞定了..问题出在  这里 要加一个

     <ItemsControl.ItemContainerStyle>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="Canvas.Left" Value="{Binding Left}" />
                        <Setter Property="Canvas.Top" Value="{Binding Top}" />
                    </Style>
                </ItemsControl.ItemContainerStyle>


    Everyone Is NO.1

    2012年5月29日 4:41
  • 因为一个ItemsControl的可视树中,先是包含一个 ItemsPanel, 然后在 ItemsPanel中的直接子元素就是我们的ItemContainer, 这里既是ContentPresenter。 所以只有 ContentPresenter 上的Canvas附加属性才会有效,而ContentPresenter里面元素的不是Canvas直接的子元素,所以无效。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 MakubeXSoft 2012年5月29日 12:13
    2012年5月29日 10:04
    版主

全部回复

  • 自己搞定了..问题出在  这里 要加一个

     <ItemsControl.ItemContainerStyle>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="Canvas.Left" Value="{Binding Left}" />
                        <Setter Property="Canvas.Top" Value="{Binding Top}" />
                    </Style>
                </ItemsControl.ItemContainerStyle>


    Everyone Is NO.1

    2012年5月29日 4:41
  • 因为一个ItemsControl的可视树中,先是包含一个 ItemsPanel, 然后在 ItemsPanel中的直接子元素就是我们的ItemContainer, 这里既是ContentPresenter。 所以只有 ContentPresenter 上的Canvas附加属性才会有效,而ContentPresenter里面元素的不是Canvas直接的子元素,所以无效。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 MakubeXSoft 2012年5月29日 12:13
    2012年5月29日 10:04
    版主