使用ScrollViewer以编程方式将图像添加到StackPanel

时间:2012-12-20 14:36:05

标签: wpf xaml c#-4.0

我的代码在目录中搜索包含图像,然后应该加载 他们进入可滚动的面板。

foreach (FileInfo item in di.GetFiles())
        {
            if (item.Extension.ToLower().Contains("tif")){

                Image im = new Image();
                im.Height = 93; im.Width = 90;

                im.Margin =new Thickness( imLeft,217,0,0);
                im.Name = "Image" + imLeft.ToString();
                im.MouseLeftButtonDown += im_MouseLeftButtonDown;
                imLeft += 91;
                BitmapImage myBitmapImage = new BitmapImage();


                myBitmapImage.BeginInit();
                myBitmapImage.UriSource = new Uri(item.FullName);

                myBitmapImage.DecodePixelWidth = 200;
                myBitmapImage.EndInit();
                //set image source
                im.Source = myBitmapImage;
                im.Visibility = Visibility.Visible;
                SP1.Children.Add(im);


            }
        }

执行此代码后,我看到滚动出现但图像不可见?在调试时,我看到每一行都使用正确的参数正确执行。 所以,我的问题是为什么图像不可见?

谢谢。

这是我的XAML:

<ScrollViewer Margin="0,216,0,9" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden" Name="myScrollViever" >
        <StackPanel Height="90" HorizontalAlignment="Left" Name="SP1" VerticalAlignment="Top" Orientation="Horizontal" 
                    CanHorizontallyScroll="True" ForceCursor="False" SnapsToDevicePixels="True" OverridesDefaultStyle="True" >
        </StackPanel>

  </ScrollViewer>

1 个答案:

答案 0 :(得分:2)

您的图像的上边距为217,其中StackPanel高度仅设置为90.因此图像位于可见区域之外。

尝试使用您的解决方案而不设置任何边距,尤其是在没有增加左边距的情况下。这就是StackPanel所做的,它将图像并排放置在水平方向,因为你设置了Orientation="Horizontal"


无论如何,一个更好的解决方案是用ListBox替换StackPanel,只需将图像添加到Items集合中:

<ListBox x:Name="list">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding}" Width="90" Margin="1,0,0,0"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

在代码中,您只需添加如下图像:

string directory = ...
foreach (var file in Directory.GetFiles(directory).Where(f => f.EndsWith(".tif")))
{
    // list.Items.Add(new BitmapImage(new Uri(file)));
    // or just add the filename, a default type converter will convert it into an ImageSource
    list.Items.Add(file);
}

下一步可能是使用ImagePaths类型为ObservableCollection<string>的属性创建一个视图模型对象,并将ListBox的ItemsSource绑定到该属性。