Frage

I tried this code to get thumbnail images fo websites using Websites Screenshot DLL but the images are not displayed inside my itemscontrol and I get no errors.

public void ImagesActivities()
{
    //sep s = new sep();
    var images = new ObservableCollection<sep>();
    var wcf = new ServiceReferenceSites.SiteEnPlusServiceClient();
    foreach (var item in wcf.GetAll())
    {
        sep s = new sep();
        s.title = item.title;
        s.thumbnail = (System.Drawing.Image)GetThumbImage(item.urlsite);
        images.Add(s);
    }
    _activityList.ItemsSource = images;
}

private Bitmap GetThumbImage(string s)
{

    WebsitesScreenshot.WebsitesScreenshot _Obj;
    _Obj = new WebsitesScreenshot.WebsitesScreenshot();
    WebsitesScreenshot.WebsitesScreenshot.Result _Result;
    _Result = _Obj.CaptureWebpage(s);
    if (_Result == WebsitesScreenshot.
                WebsitesScreenshot.Result.Captured)
    {
        _Obj.ImageWidth = 200;
        _Obj.ImageHeight = 100;
        _Obj.ImageFormat = WebsitesScreenshot.
            WebsitesScreenshot.ImageFormats.PNG;
        return _Obj.GetImage();
    }
    else
        return null;
}

and this is the code of my itemscontrol:

  <ItemsControl x:Name="_activityList"  HorizontalAlignment="Right" Margin="0,10,10,10"  Width="760">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="5" IsItemsHost="True"/>
                <!--<StackPanel Orientation="Horizontal" IsItemsHost="True"/>-->
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Button Grid.Row="0" Margin="10,20,0,0" BorderThickness="0" Height="100" Width="200">
                        <Button.Background>
                            <ImageBrush ImageSource="{Binding thumbnail}"  />
                        </Button.Background>
                    </Button>
                    <TextBlock Grid.Row="1" x:Name="nom" Margin="10,0,0,0" TextAlignment="Center" Text="{Binding title}" VerticalAlignment="Center"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

This is my sep class

public class sep
{
    public string title { get; set; }
    public System.Drawing.Image thumbnail { get; set; }
}

Can anyone please help me.

War es hilfreich?

Lösung

Essentially you have been drawing nulls. The older style of bitmaps do not really travel that well into WPF. You can change this code...

   sep s = new sep();
    s.title = item.title;
    s.thumbnail = (System.Drawing.Image)GetThumbImage(item.urlsite);

to this...

        Sep sep = new Sep();
        sep.Title = "title";
        var bmp = GetThumbImage("xxx");
        using (MemoryStream memory = new MemoryStream())
        {
            bmp.Save(memory, ImageFormat.Png);
            memory.Position = 0;
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.BeginInit();
            bitmapImage.StreamSource = memory;
            bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
            bitmapImage.EndInit();
            sep.ThumbnailImage = bitmapImage;
        }

This code runs an ad-hoc conversion on the Bitmap so that it can be used as a WPF ImageSource.

The 'sep' class is declared with an ImageSource like this...

public class Sep : INotifyPropertyChanged
{
    private string _title;
    public string Title
    {
        [DebuggerStepThrough]
        get { return _title; }
        [DebuggerStepThrough]
        set
        {
            if (value != _title)
            {
                _title = value;
                OnPropertyChanged("Title");
            }
        }
    }
    private ImageSource _thumbnailImage;
    public ImageSource ThumbnailImage
    {
        [DebuggerStepThrough]
        get { return _thumbnailImage; }
        [DebuggerStepThrough]
        set
        {
            if (value != _thumbnailImage)
            {
                _thumbnailImage = value;
                OnPropertyChanged("ThumbnailImage");
            }
        }
    }
    #region INotifyPropertyChanged Implementation
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string name)
    {
        var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    #endregion
}

In the longer run, you can consider refactoring the conversion into an IValueConverter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top