Проблема с отображением основных деталей CurrentItem System.Controls.Image - PullRequest
0 голосов
/ 28 июня 2011

Я пытаюсь отобразить имя объекта Photo в метке, но я отображаю это фото в конкретном элементе управления System.Windows.Image, этот элемент управления имеет привязку к CurrentItem коллекции фотографий, поэтому если яУ меня есть кнопка для отображения следующей фотографии, я хочу показать в своей метке имя фотографии (текущий элемент коллекции !!!!) или другое свойство внутри этого элемента.

открытый класс Photo {Nameназвание;BitmapFrame _image;

    public Photo(string path)
    {
        Name = path;
        _image = BitmapFrame.Create(_source);
    }

    public BitmapFrame ImageFrame { get { return _image; } set { _image = value; } }
 }

открытый частичный класс ImageViewer: Window {int currentIndex = 0;ObservableCollection photos;

    public ImageViewer()
    {
        InitializeComponent();

        photos = new ObservableCollection<Photo>();

        Photo photo1 = new Photo(@"C:/Users/.../DSC00700.jpg");
        Photo photo2 = new Photo(@"C:/Users/../DSC00581.jpg");
        Photo photo3 = new Photo(@"C:/Users/../3882_6.jpg");

        photos.Add(photo1);
        photos.Add(photo2);
        photos.Add(photo3);

        this.DataContext = photos;
    }

    private void NextPhoto(object sender, RoutedEventArgs e)
    {
        currentIndex++;
        if (currentIndex == photos.Count)
            currentIndex = 0;
        image.Source = photos[currentIndex].ImageFrame;
    }

}

код xaml:

        <Image 
            Grid.Column="0"
            Grid.Row="0"
            Name="image"
            Stretch="Fill" 
            DataContext ="{Binding /}"
            Source="{Binding ImageFrame}"
         >
        </Image>

        <TextBlock 
            DataContext="{Binding ElementName=image, Path=DataContext}"
            Text="{Binding Name}">
         </TextBlock>

С уважением, Иван

1 Ответ

0 голосов
/ 29 июня 2011

XMAL:


        <Image 
            Margin="0,0,5,0"
            Grid.Column="0"
            Grid.Row="0"
            Name="image"
            Stretch="UniformToFill" 
            DataContext ="{Binding SelectedPhoto, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type dns:MainWindow}}}"
            Source="{Binding ImageFrame}" HorizontalAlignment="Center" VerticalAlignment="Center">
        </Image>
        <ScrollBar Height="20" Name="scbImages" Orientation="Horizontal" Grid.Column="0"
            Grid.Row="1" Maximum="0" SmallChange="1" ValueChanged="scbImages_ValueChanged" />

        <GroupBox Name="info" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2">
            <GroupBox.HeaderTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Label Content="Name: "/>
                        <Label DataContext="{Binding Path=DataContext, ElementName=image}" Content="{Binding Name}"></Label>
                    </StackPanel>
                </DataTemplate>
            </GroupBox.HeaderTemplate>
            <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
                <StackPanel DataContext="{Binding Path=Metadata, ElementName=image}">
                    <Label>Size:</Label>
                    <Label Content="{Binding}"></Label>
                    <Label >Date Image Taken:</Label>
                    <Label Content="{Binding DateImageTaken}" />
                    <Label >Camera Model:</Label>
                    <Label Content="{Binding CameraModel}"/>
                    <Label >Creation Software:</Label>
                    <Label Content="{Binding CreationSoftware}" />
                    <Label >Lens Aperture:</Label>
                    <Label Content="{Binding LensAperture}" />
                    <Label >Focal Length:</Label>
                    <Label Content="{Binding FocalLength}" />
                    <Label >ISO Speed:</Label>
                    <Label Content="{Binding IsoSpeed}" />
                    <Label >Exposure Time:</Label>
                    <Label Content="{Binding ExposureTime}" />
                    <Label >Exposure Mode:</Label>
                    <Label Content="{Binding ExposureMode}" />
                    <Label >Exposure Compensation:</Label>
                    <Label Content="{Binding ExposureCompensation}" />
                    <Label >White Balance Mode:</Label>
                    <Label Content="{Binding WhiteBalanceMode}" />
                    <Label >Color Representation:</Label>
                    <Label Content="{Binding ColorRepresentation}" />
                </StackPanel>
            </ScrollViewer>
        </GroupBox>
    </Grid>
</Grid>

Cs:

с использованием System;using System.Collections.Generic;using System.Collections.ObjectModel;использование System.Linq;используя System.Text;используя System.Windows;использование System.Windows.Controls;используя System.Windows.Data;использование System.Windows.Documents;использование System.Windows.Input;используя System.Windows.Media;using System.Windows.Media.Imaging;использование System.Windows.Navigation;using System.Windows.Shapes;

пространство имен WpfApplication2 {/// /// Логика взаимодействия для MainWindow.xaml /// открытый частичный класс MainWindow: Window {приватная строка photosDir = @ "D: \ Users \ Rafael\ Gaby \ Fotos \ 5 x 7 ";private ObservableCollection photos = new ObservableCollection ();

    public static DependencyProperty SelectedPhotoIndexProperty = DependencyProperty.Register("SelectedPhotoIndex", typeof(double), typeof(MainWindow));
    public static DependencyProperty SelectedPhotoProperty = DependencyProperty.Register("SelectedPhoto", typeof(Photo), typeof(MainWindow));

    public MainWindow()
    {
        InitializeComponent();

        foreach(var curImg in System.IO.Directory.GetFiles(this.photosDir))
            photos.Add(new Photo(curImg));

        if(photos.Count > 0)
        {
            this.scbImages.Maximum = photos.Count - 1;
            this.SelectedPhotoIndex = 0;
        }
    }

    public double SelectedPhotoIndex
    {
        get
        { return this.GetValue(SelectedPhotoIndexProperty) != null ? (double)this.GetValue(SelectedPhotoIndexProperty) : 0; }
        set
        { 
            this.SetValue(SelectedPhotoIndexProperty, value);
            this.SelectedPhoto = photos[(int)value];
        }
    }
    public Photo SelectedPhoto
    {
        get { return this.GetValue(SelectedPhotoProperty)as Photo; }
        set
        {
            this.SetValue(SelectedPhotoProperty, value);
        }
    }

    private void scbImages_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        this.SelectedPhotoIndex = (int)e.NewValue;
    }
}

public class Photo
{
    public Photo(string path)
    {
        Name = path;
        ImageFrame = BitmapFrame.Create(new Uri(path));
    }

    public string Name
    { get; set; }
    public BitmapFrame ImageFrame { 
        get;
        set;
    }
}

}

...