C# WPF Nie może odnazleźć Bass.net w mainwindow (xaml) - uzywam go w usercontrol

0

Witam.

  1. Dodałem referencję do bass.net
    666c7d68ac.png

  2. Utworzyłem usercontrol i dodałem w niej przestrzeń nazw bass.net
    9e18fcfa5d.png

  3. Program mi się kompiluje poprawnie
    4464696c20.png

  4. Problem leży w MainWindow.xaml - Wyskakuje mi taki komunikat:
    b3e1ede90b.png

Wiecie co może być nie tak?

0

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.

1

Pokaż co masz 'na górze' w MainWindow.xaml (tam gdzie są te całe xmlns:"....")

0
<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"> 
0

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 />
0

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.

1

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

0

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
87f8f32d33.png
Zmiana copy local na true nic nie zmienia.

0

Ewentuanie czy z pomocą stardardowych przestrzeni nazw można utworzyć taki obraz muzyki / filmu?
1cc7129ee1.png
W czym to w takim razie jest zawarte?

0

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");
            }
        }

    }
} 
1

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:

  1. Przeniosłam ten BASS_Init do Window, bo kontrolka nie ma do niego dostępu w konstruktorze (głowy nie dam, czy później ma).
  2. Zmieniłam ostatni parametr na to obejście wyżej.
  3. BASS_Init wywołuję dopiero po zdarzeniu Loaded.
    Wtedy IntPtr ma wartość i błędu już nie ma.
0

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

0

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.

0

Ale masz skopiowane dll z bass.net, czy z oryginalnego bass? Bo z wstepu to nie wynika

1 użytkowników online, w tym zalogowanych: 0, gości: 1