Chcę stworzyć listę obiektów składającą się obrazków. Moje obiekty to drinki. Każdy z nich ma swoje parametry w postaci nazwy, składników i tam innych oraz ścieżki do obrazu na dysku. I teraz nie wiem jak mam zrobić żeby było przykładowo po 4 obrazki w wierszu z podpisem. Nie wiem jak wczytać te obrazy z dysku i wstawić do listview.
-
Image.FromFile("path here")
- http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.drawsubitem%28v=vs.110%29.aspx
@spartanPAGE w tagach jest wpf.
<?xml version="1.0" encoding="UTF-8"?>
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="WpfTutorialSamples.ListView_control.ListViewBasicSample" Title="ListViewBasicSample" Height="200" Width="200">
<Grid>
<ListView Margin="10">
<ListViewItem>
<StackPanel Orientation="Horizontal">
<Image Source="/WpfTutorialSamples;component/Images/bullet_green.png" Margin="0,0,5,0" />
<TextBlock>Green</TextBlock>
</StackPanel>
</ListViewItem>
<ListViewItem>
<StackPanel Orientation="Horizontal">
<Image Source="/WpfTutorialSamples;component/Images/bullet_blue.png" Margin="0,0,5,0" />
<TextBlock>Blue</TextBlock>
</StackPanel>
</ListViewItem>
<ListViewItem IsSelected="True">
<StackPanel Orientation="Horizontal">
<Image Source="/WpfTutorialSamples;component/Images/bullet_red.png" Margin="0,0,5,0" />
<TextBlock>Red</TextBlock>
</StackPanel>
</ListViewItem>
</ListView>
</Grid>
</Window>
Źródło: http://www.wpf-tutorial.com/listview-control/simple-listview/
Chodziło mi bardziej o takie ułożenie niż jedno pod drugim. Do takiego sięgnę w ostateczności.
Więc zrób to w gridzie a nie w listView.
A jak sobie poradzić z tym że zdjęcia są na dysku a nie w zasobach programu? Jakimś tutorialem co do tego jak to zrobić w gridzie byś poratował ?
A tu http://tnij.org/zxpya3y szukałeś?
@GarryMoveOut - to co pokazałeś na obrazku także można uzyskać z listView; Wystarczy skorzystać z odpowiedniego stylu komponentu; Zobacz pod te linki:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb774735(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/apps/hh850406.aspx
A nawet nie wiedziałem, ale to co podał @furious programming jest dla WF, tu masz WFP http://www.codeproject.com/Articles/18561/Custom-ListBox-Layout-in-WPF
@dam1an dzięki za link. Skorzystałem. W linku było pokazane na "window" ja używam "usercontrol", ale przystosowałem kod do mojego programu. Mimo że działa mam kilka problemów.
- Nie każdy drink ma swoje zdjęcie. W folderze gdzie trzymam obrazy, jest też obraz domyślny w przypadku gdy drink nie ma obrazu. Nie wiem jak zrobić żeby się wyświetlały tylko te które mają, a domyślny obrazek się nie wczytywał. Tutorial przedstawia tylko pokazywanie obrazków z folderu. Lista nie jest listą obiektów klasy w moim przypadku drink która przechowuje również inne informacje, nie wiem jak po kliknięciu na jednym z obrazków odwołać się do drinka który ma to właśnie zdjęcie.
2)Mam błąd Błąd "Nie można odnaleźć części ścieżki „C:\Windows\system32\images\drinki”" choć zdjęcia się wyświetlają. A program działa
3)W przykładowym programie po rozciąganiu okna zdjęcia ustawuały się obok siebie a u mnie już tak nie jest. Ale na razie to najmniej istotny problem
EDIT
Znalazłem też takie coś. http://www.dreamincode.net/forums/topic/261144-putting-items-in-listview-with-image-and-name/
Ale za chiny nie mogę code behind zrobić aby string z ścieżką zamieniało mi na obraz i go wyświetlało.
EDIT
Kolejny edit. Udało mi się zrobić że obiekty (ich nazwy, bo obrazków nie mogę wyświetlić) pojawiają się w "boxach" obok siebie. Użyłem do tego listboxa i wzorowałem się na linku wyżej. Wyszło nawet dobrze. Problem jest taki że nie mam dalej zdjęć no i wszystkie listboxy mi tak wyświetlają. W jednym oknie mam karty a w niektórych kartach mam inne listboxy. Jak zrobić żeby tylko w tym jednym listboxie się ustawiały obiekty w "boksach" a nie w wszystkich w oknie. Kod:
...
<TabItem Header="Lista">
<Grid Background="#FFE5E5E5">
<ListBox Name="lb_drinki" HorizontalAlignment="Left" VerticalAlignment="Top" Height="650" Width="1254" Margin="10,10,0,0" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="0,2">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<Image Grid.Row="0" Width="10" Height="10" Source="{Binding sciezka}"/>
<TextBlock Grid.Row="1" Text="{Binding nazwa}" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</TabItem>
...
<UserControl.Resources>
<Style TargetType="ListBox">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
Pokaż w jaki sposób wczytujesz te ścieżki do obrazków.
Znalazłem też takie coś. http://www.dreamincode.net/for[...]-listview-with-image-and-name/
Ale za chiny nie mogę code behind zrobić aby string z ścieżką zamieniało mi na obraz i go wyświetlało.
Tutaj podają ścieżki relatywne bo obrazki są częścią projektu.
Ty musisz zrobić coś takiego przykład jeśli nie ma obrazka wczytać domyślny:
public class Drink
{
private string _imageUrl;
private readonly string _defaultPath =
System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
+ "\\images\\logo.jpg";
public string Name { get; set; }
public string ImageUrl
{
get { return _imageUrl ?? _defaultPath; }
set { _imageUrl = value; }
}
}
Stworzyłem ręcznie nowy drink i podałem w nim ścieżkę absolutną i zdjęcie się wyświetla. Czy istnieje jakiś sposób aby listbox zmieniał ścieżkę z relatywnej na absolutną czy muszę zmienić ścieżki wszystkich drinków na ścieżki absolutne ?
string absolutePath = Directory.GetCurrentDirectory() + @"\MyImagesFolderInProjectDirectory\Image.jpg";
OK. Tutaj jest paczka 7zip http://1drv.ms/1BRRbep
public void wcz_listy()
{
lst_pDrinkow = (
from drink in xml_drinki.Root.Elements("PRZEPIS")
select new kDrink(
int.Parse(drink.Attribute("ID").Value),
drink.Element("NAZWA").Value,
drink.Element("SKLADNIKI").Value,
drink.Element("OPIS").Value, Directory.GetCurrentDirectory()+"\\"+
drink.Element("SCIEZKA").Value,
drink.Element("OCENA").Value,
bool.Parse(drink.Element("GIN").Value),
bool.Parse(drink.Element("RUM").Value),
bool.Parse(drink.Element("WODKA").Value),
bool.Parse(drink.Element("WHISKEY").Value),
bool.Parse(drink.Element("LIKKOK").Value),
bool.Parse(drink.Element("LIK").Value),
bool.Parse(drink.Element("INNE").Value)
)
).ToObservable<kDrink>();
list_przepisow.ItemsSource = lst_pDrinkow;
lb_drinki.ItemsSource = lst_pDrinkow;
}
Zamień tą metodę ze swoją.