WPF ItemsControl Datattemplate动态更新

时间:2014-08-18 21:15:31

标签: c# wpf

我是WPF技术的新手,我想问一下解决问题的可能性。

我有ItemsControl,我在其中添加图片:

<ItemsControl  Name="itemscontrol1" 
    ItemsSource="{Binding Path=PicturesList}" ItemTemplate="{StaticResource pictureTemplate}" Grid.Column="1" />

然后我准备了Datatemplate:

        <DataTemplate x:Key="pictureTemplate"> 

        <DataTemplate.Resources>

            <Style TargetType="Image">

                <Setter Property="Width" Value="180" />

                <Setter Property="Height" Value="120" />

                <Setter Property="Margin" Value="10" />

            </Style>
        </DataTemplate.Resources>

        <Image Source="{Binding Path=Location}" />
    </DataTemplate>

我的问题是,我不知道如何动态更改图像宽度和高度的参数。例如,当我更改窗口大小时,我需要更改项目控件内图像的大小。

有人可以帮助我吗?

感谢您的建议和提示。 史密斯

1 个答案:

答案 0 :(得分:0)

如果你根据UI的其余部分控制图像的大小,即窗口大小,你应该避免将它们设置为显式值,并选择一个布局面板来处理这个问题。比如使控件项面板成为一个wrappanel布局。

  <ItemsPanelTemplate x:key="griditemtemplate">
    <WrapPanel VerticalAlignment="Center"
          HorizontalAlignment="Center"/>
  </ItemsPanelTemplate>

如果视图模型中有某些内容决定了大小,请使用绑定。

要专门执行您想要的操作,您需要一个统一的网格,并能够将列数绑定到集合计数。不幸的是,根据我的知识,这不可能做到。

因此,我创建了一个自定义布局面板。很多教程available online,但基本上创建了一个扩展Panel的类,然后覆盖MeasureOverride和ArrangeOverride方法。重要的是测量...

protected override Size ArrangeOverride(Size finalSize)
{
    int i = 0;
    foreach( UIElement child in InternalChildern)
    {
        var r = new Rect(this.ActualSize / this.InternalChildren.count * i, 0, this.ActualSize / this.InteralChildren.Count, finalSize.Height);
        child.Arrange( r );
        i++;
    }
}

这是我手机上写的近似代码,如果需要重构,请致歉。

然后使用此面板作为ItemsPanel模板,如前所示。