Witam :)
Mam DataGrida z obrazkiem w pierwszej kolumnie. Każdy item ma stringa przechowującego ścieżkę do obrazka wyświetlanego (obrazek symbolizuje stany utworu np. odtwarzany, error, readytoplay itp.).
namespace MediaPlayer
{
/// <summary>
/// Interaction logic for cPlayList.xaml
/// </summary>
public partial class cPlayList : UserControl
{
public cPlayList()
{
InitializeComponent();
hPlayList.ItemsSource = TrackList;
AddTrack("C:\\Users\\Świdwa\\Desktop\\UTWORY\\Abba - Mamma Mia.mp3");
CurrentPlaying = TrackList[0];
}
private cPC PC = new cPC();
public ObservableCollection<cTrack> TrackList = new ObservableCollection<cTrack>();
// Aktualnie odtwarzany
private cTrack currentPlaying { get; set; }
public cTrack CurrentPlaying
{
get
{
return currentPlaying;
}
set
{
if(currentPlaying != null)
currentPlaying.SetIcon(cTrack.eTrackStatus.ready);
currentPlaying = value;
if (currentPlaying != null)
currentPlaying.SetIcon(cTrack.eTrackStatus.play);
PC.OnPropertyChanged("CurrentPlaying");
}
}
// Add Track
public bool AddTrack(string Path)
{
if (!File.Exists(@Path) || !RequiredTrackCondition(Path))
return false;
TrackList.Add(new cTrack(Path));
return true;
}
private bool RequiredTrackCondition(string Path)
{
int IndexOfAmp = Path.IndexOf('.');
if (IndexOfAmp == -1)
return false;
string amp = Path.Substring(IndexOfAmp + 1);
switch (amp.ToLower())
{
case "mp3": return true;
case "wave": return true;
case "ogg": return true;
case "mp4": return true;
case "wav": return true;
case "bmp": return true;
case "png": return true;
case "gif": return true;
case "3gp": return true;
case "4gp": return true;
case "avi": return true;
case "wmv": return true;
case "m3p": return true;
case "m4p": return true;
}
return false;
}
// Drop Down
private void hPlayList_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
{
e.Effects = DragDropEffects.All;
string[] DroppedFiles = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in DroppedFiles)
{
if (file.IndexOf('.') == -1)
hPlayList_DropDirectory(file);
else
AddTrack(file);
}
}
}
private void hPlayList_DropDirectory(string veriable)
{
string[] filePath = Directory.GetFiles(veriable);
foreach (string Path in filePath)
{
if (Path.IndexOf('.') == -1)
hPlayList_DropDirectory(Path);
else
AddTrack(Path);
}
}
// Delete Track
private void PlayListKeyDown(object sender, KeyEventArgs e)
{
MoveNextTrack(); return;
var grid = (DataGrid)sender;
if (Key.Delete == e.Key)
{
int count = hPlayList.SelectedItems.Count;
if (count <= 0)
return;
var LastItem = (cTrack)hPlayList.SelectedItems[count - 1];
while (hPlayList.SelectedItems.Count > 1)
{
if ((hPlayList.SelectedItems[0] as cTrack).TrackIcon == "Textures\\Play16.png")
CurrentPlaying = null;
TrackList.Remove((cTrack)hPlayList.SelectedItems[0]);
}
int index = hPlayList.Items.IndexOf(LastItem);
TrackList.Remove((cTrack)LastItem);
if (index >= hPlayList.Items.Count)
index = hPlayList.Items.Count - 1;
if (index >= 0)
{
hPlayList.SelectedItem = hPlayList.Items[index];
hPlayList.CurrentCell = new DataGridCellInfo(hPlayList.Items[index], hPlayList.Columns[1]);
}
}
}
// Change Played
private void MoveNextTrack()
{
if (TrackList.Count == 0 || CurrentPlaying == null)
return;
int currIndex = TrackList.IndexOf(CurrentPlaying);
++currIndex;
if (currIndex >= TrackList.Count)
currIndex = 0;
CurrentPlaying = TrackList[currIndex];
}
private void MovePrevTrack()
{
if (TrackList.Count == 0 || CurrentPlaying == null)
return;
int currIndex = TrackList.IndexOf(CurrentPlaying);
--currIndex;
if (currIndex < 0)
currIndex = TrackList.Count-1;
CurrentPlaying = TrackList[currIndex];
}
}
public class cTrack
{
public cTrack(string Path)
{
this.Name = Path;
this.Time = Path;
this.Path = Path;
SetIcon(eTrackStatus.ready);
}
private cPC PC = new cPC();
public enum eTrackStatus
{
ready,
play,
error,
next1,
next2,
next3,
next4,
next5,
next6,
next7,
next8,
next9
}
// Iconpath
public void SetIcon(eTrackStatus icon)
{
TrackIcon = IconPath(icon);
}
private string IconPath(eTrackStatus select)
{
switch(select)
{
case eTrackStatus.ready:
return "Textures\\Ready16.png";
case eTrackStatus.play:
return "Textures\\Play16.png";
case eTrackStatus.error:
return "Textures\\Error16.png";
case eTrackStatus.next1:
return "Textures\\Next16.png";
}
return "";
}
private string trackIcon;
public string TrackIcon
{
get { return this.trackIcon; }
private set
{
this.trackIcon = value;
PC.OnPropertyChanged("TrackIcon");
}
}
// Name, Path and Time
private string name;
public string Name {
get
{
return name;
}
private set
{
try
{
string Path = value;
name = Path.Substring(Path.LastIndexOf('\\') + 1, Path.LastIndexOf('.') - Path.LastIndexOf('\\') - 1);
}
catch
{
name = "none";
}
PC.OnPropertyChanged("Name");
}
}
private string time;
public string Time
{
get
{
return time;
}
private set
{
try
{
var player = new WindowsMediaPlayer();
var clip = player.newMedia(value);
if (clip != null)
time = clip.durationString;
else
time = "error";
player.close();
}
catch
{
time = "error";
}
PC.OnPropertyChanged("Time");
}
}
private string path;
public string Path
{
get
{
return path;
}
private set
{
try
{
path = value;
}
catch
{
path = "";
}
PC.OnPropertyChanged("Path");
}
}
}
public class cPC : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
<UserControl x:Class="MediaPlayer.cPlayList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<DataGrid x:Name="hPlayList" IsReadOnly="True" CanUserResizeRows="False" GridLinesVisibility="None" AutoGenerateColumns="False" HeadersVisibility="Column" AllowDrop="True" CanUserDeleteRows="False" Drop="hPlayList_Drop" PreviewKeyDown="PlayListKeyDown">
<DataGrid.Columns>
<!--definicje kolumn-->
<DataGridTemplateColumn Header=" " CanUserResize="False" MaxWidth="16" MinWidth="16">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Path=TrackIcon}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" CanUserResize="False" Width="*"/>
<DataGridTextColumn Header="Time" Binding="{Binding Path=Time}" CanUserResize="False" MaxWidth="42" MinWidth="42"/>
</DataGrid.Columns>
<!--Zmiana zaznaczenia-->
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<!--Zaznaczenie-->
<Setter Property="Background" >
<Setter.Value>
<RadialGradientBrush>
<GradientStop Color="#FF7EC13B" Offset="0.159"/>
<GradientStop Color="#7F22932C" Offset="1"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="BorderBrush"
Value="Blue" />
<Setter Property="BorderThickness"
Value="0,1" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
</Grid>
</UserControl>
jak widać wszystko jest zbindowane, OnPropertyChange też powinno działać. Nie wiem o co chodzi :( Obrazek zmienia się dopiero jak przewinę scrollbarem tak, aby element zniknął i potem jak przewine z powrotem to jest już ok.
Po wywołaniu metody MoveNextTrack() nutka powinna zniknąć z jednego i wskoczyć na kolejny utwór, niestety efekt wizualny dopiero jest widoczny po przewinięciu suwakiem.