Witam.
-
Dodałem referencję do bass.net
-
Utworzyłem usercontrol i dodałem w niej przestrzeń nazw bass.net
-
Program mi się kompiluje poprawnie
-
Problem leży w MainWindow.xaml - Wyskakuje mi taki komunikat:
Wiecie co może być nie tak?
Witam.
Dodałem referencję do bass.net
Utworzyłem usercontrol i dodałem w niej przestrzeń nazw bass.net
Program mi się kompiluje poprawnie
Problem leży w MainWindow.xaml - Wyskakuje mi taki komunikat:
Wiecie co może być nie tak?
An exception of type 'System.IO.FileNotFoundException' occurred in MediaPlayer.exe but was not handled in user code
Additional information: Nie można załadować pliku lub zestawu 'Bass.Net, Version=2.4.12.1, Culture=neutral, PublicKeyToken=b7566c273e6ef480' lub jednej z jego zależności. Nie można odnaleźć określonego pliku.
Problem w tym, że mam ten plik i w ścieżce do projektu i w ścieżce do folderu debug.
Pokaż co masz 'na górze' w MainWindow.xaml (tam gdzie są te całe xmlns:"....")
<Window x:Class="MediaPlayer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MediaPlayer"
Title="MainWindow" Height="350" Width="525">
No to myślę, że już wszystko jasne. Widok nie widzi Twoich kontrolek z dodanej przez Ciebie referencji do projektu.
To co musisz zrobić to dodać:
xmlns:bass="Tutaj ścieżka do przestrzeni nazw biblioteki, którą dodałeś. IDE uzupełnia tę sekcję przy wpisywaniu."
Później układając kontrolki w GUI robisz:
<bass:kontrolka />
Bass.net.dll to biblioteka do obsługi dźwięku. Używam jej w usercontrol:
using Un4seen.Bass;
namespace MediaPlayer
{
/// <summary>
/// Interaction logic for cSpectrum.xaml
/// </summary>
public partial class cSpectrum : UserControl
{
// Kontruktor
public cSpectrum()
{
Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero);
InitializeComponent();
}
O ile samo using Un4seen.Bass nie powoduje błędu, dodanie BASSInit() już go powoduje.
Nie rozumiem, dlaczego w WPF nie widać biblioteki, a z poziomu C# wszystko się ładnie kompiluje.
Tam gdzie masz te wszystkie xmlns ... spróbuj dodać:
xmlns:bass="clr-namespace:Un4seen.Bass;assembly=Bass.Net"
ogólnie to ma być (tak przykładowo) taki format:
xmlns:core="clr-namespace:System;assembly=mscorlib"
Daj znać czy teraz działa.
Pozdrawiam
Niestety, to nic nie zmieniło. A o co chodzi z odpowiedzią:
Później układając kontrolki w GUI robisz:
<bass:kontrolka />
Przecież kontrolka nie jest zawarta w bass: tylko w local:, tak?
MainWindow.xaml - http://4programmers.net/Pastebin/5663
MainWindow.xaml.cs - http://4programmers.net/Pastebin/5665
Spectrum.xaml - http://4programmers.net/Pastebin/5666
Soectrum.xaml.cs - http://4programmers.net/Pastebin/5667
Screen z Bass.net reference property
Zmiana copy local na true nic nie zmienia.
Ewentuanie czy z pomocą stardardowych przestrzeni nazw można utworzyć taki obraz muzyki / filmu?
W czym to w takim razie jest zawarte?
Zrobiłem teraz tak:
usunąłem z UserControl wszystko związane z bass.net.dll i zrobiłem oddzielną klasę. Teraz pobieram spectrum następująco:
Bitmap = TrackOperation.GetTrackSpectrum("C:\\Users\\Świdwa\\Desktop\\UTWORY\\Abba - Mamma Mia.mp3", hImage);
using Un4seen.Bass;
namespace MediaPlayer
{
static public class TrackOperation
{
static public System.Drawing.Bitmap GetTrackSpectrum(string path, Image Image)
{
int stream = Bass.BASS_StreamCreateFile("C:\\Users\\Świdwa\\Desktop\\UTWORY\\Abba - Mamma Mia.mp3", 0, 0, BASSFlag.BASS_DEFAULT);
if (stream == 0)
return null;
Un4seen.Bass.Misc.Visuals v = new Un4seen.Bass.Misc.Visuals();
System.Drawing.Bitmap Bitmap = v.CreateSpectrum(stream,
(int)Image.ActualWidth,
(int)Image.ActualHeight,
System.Drawing.Color.Lime, System.Drawing.Color.Red, System.Drawing.Color.Black,
false, false, false);
return Bitmap;
}
}
}
Niestety gdy używam podanej metody występuje identyczny błąd, a gdy ją usunę kontrolka zaczyna działać.
...
using System.Windows.Shapes;
using System.IO;
namespace MediaPlayer
{
/// <summary>
/// Interaction logic for cSpectrum.xaml
/// </summary>
public partial class cSpectrum : UserControl
{
// Kontruktor
public cSpectrum()
{
InitializeComponent();
Bitmap = TrackOperation.GetTrackSpectrum("C:\\Users\\Świdwa\\Desktop\\UTWORY\\Abba - Mamma Mia.mp3", hImage);
}
// property Change
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
// Media Element
private MediaElement HMedia{ get; set; }
public MediaElement hMedia
{
get
{
return HMedia;
}
set
{
HMedia = value;
if(hMedia != null)
{
Uri Track = hMedia.Source;
if(Track != null)
{
Bitmap = TrackOperation.GetTrackSpectrum("C:\\Users\\Świdwa\\Desktop\\UTWORY\\Abba - Mamma Mia.mp3", hImage);
}
}
}
}
private System.Drawing.Bitmap bitmap { get; set; }
public System.Drawing.Bitmap Bitmap
{
get
{
return bitmap;
}
set
{
bitmap = value;
OnPropertyChanged("Bitmap");
}
}
}
}
Nie wiem, co jest problemem w ostatnim rozwiązaniu, ale we wcześniejszym masz Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero);
, przy czym dokumentacja mówi:
win
Type: System.IntPtr
The application's main window... Zero = the desktop window (use this for console applications).
W WinForms bodajże Form ma właściwość Handle, która temu parametrowi da wartość, w WPF chyba nie ma odpowiednika, ale jest obejście: new WindowInteropHelper(wpfWindow).Handle;
(http://www.ticklishtechs.net/2009/12/22/how-to-get-a-iwin32window-from-a-wpf-window/)
Tak na szybko:
To nie to wywołuje problem. Problem jest ze znalezieniem biblioteki przez wpf. Cs widzi ja, mogę dodać przestrzeń nazw i wszystko mi się ladnie kompiluje. Dodam, ze błąd powstaje dopiero jak używam biblioteki wewnątrz usercontrol, w głównej aplikacji działa
Plik bass.dll i bass.xml z oryginalnej biblioteki (bo bass.net jest wrapperem) musza byc skopiowane bezposrednio do katalogu z kompilowanymi plikami (dla winforms to jest katalog debug projektu). Samo dodanie referencji do bass.net nic nie da.
Ale masz skopiowane dll z bass.net, czy z oryginalnego bass? Bo z wstepu to nie wynika