Check Articles section to find articles in your language.

Tutorial dla XAML

W tym tutorialu omówimy model obiektowy partytury, import danych w formacie MusicXml oraz prezentację nut przy użyciu technologii wykorzystujących XAML (WPF, SIlverlight, Silverlight for Windows Phone, Windows Runtime).

Stwórz w Visual Studio nowy projekt typu WPF. Następnie dodaj jako referencje cztery biblioteki: Manufaktura.Controls, Manufaktura.Controls.WPF, Manufaktura.Music i Manufaktura.Model. Pierwsza biblioteka zawiera model obiektowy partytury, parser MusicXml i wieloplatformowy engine rysowania nut. W drugiej znajduje się specyficzna implementacja pod WPF. Dwie pozostałe to biblioteki klas bazowych, z których korzystają dwie pierwsze.

Kolejnym krokiem będzie stworzenie modelu danych, których użyjemy do testów. Stwórzmy nową klasę o nazwie TestDataViewModel:

public class TestDataViewModel : ViewModel
    {
        private Score data;

        public Score Data
        {
            get { return data;  }
            set { data = value; OnPropertyChanged(() => Data); }
        }

        public void LoadTestData()
        {

        }
    }

Klasa bazowa ViewModel pochodzi z przestrzeni nazw Manufaktura.Model.MVVM i zawiera domyślną implementację metody OnPropertyChanged, która informuje widok o zmianach w modelu. Właściwość Data zawiera model danych, czyli partyturę, którą wyświetlimy na kontrolce. W metodzie LoadTestData utworzymy przykładowy model:

public void LoadTestData()
        {
            var score = Score.CreateOneStaffScore(Clef.Treble, new MajorScale(Step.C, false));
            score.FirstStaff.Elements.Add(new Note(Pitch.C5, RhythmicDuration.Quarter));
            score.FirstStaff.Elements.Add(new Note(Pitch.B4, RhythmicDuration.Quarter));
            score.FirstStaff.Elements.Add(new Note(Pitch.C5, RhythmicDuration.Half));
            score.FirstStaff.Elements.Add(new Barline());            Data = score;
  
      }

Przejdź do edycji MainWindow.xaml. Aby dodać do formatki kontrolkę rysowania nut, należy umieścić w rządanym miejscu następującą linijkę:

<ManufakturaControls:NoteViewer ScoreSource="{Binding Data}" />

 

Właściwość ScoreSource kontrolki bindujemy do właściwości Data viewmodelu.

Aby parser XAML odnalazł klasę kontrolki, należy jeszcze zarejestrować przestrzeń nazw. Dodaj do tagu Window następujący atrybut:

xmlns:ManufakturaControls="clr-namespace:Manufaktura.Controls.WPF;assembly=Manufaktura.Controls.WPF"

 

Docelowo plik może wyglądać mniej więcej tak:

<Window x:Class="Manufaktura.WPFControlsExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ManufakturaControls="clr-namespace:Manufaktura.Controls.WPF;assembly=Manufaktura.Controls.WPF"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <ManufakturaControls:NoteViewer x:Name="noteViewer1" HorizontalAlignment="Stretch" Margin="10,10,0,0" VerticalAlignment="Top" ScoreSource="{Binding Data}"/>
        </StackPanel>
    </Grid>
</Window>

Należy teraz jeszcze przypisać ustawić viewmodel jako kontekst danych dla formatki. W konstruktorze klasy MainWindow dopisujemy:

public MainWindow()
        {
            InitializeComponent();
            var viewModel = new TestDataViewModel();
            DataContext = viewModel;
            viewModel.LoadTestData();

        }

Możemy teraz uruchomić aplikację i zobaczyć efekt. Stworzyliśmy pierwszą partyturę. ;)

Teraz dodamy do modelu kilka nowych pięciolinii. W metodzie LoadTestData dopisujemy:

var secondStaff = new Staff();
            secondStaff.Elements.Add(Clef.Treble);
            secondStaff.Elements.Add(new Key(0));
            secondStaff.Elements.Add(new Note(Pitch.G4, RhythmicDuration.Whole));
            secondStaff.Elements.Add(new Barline());
            score.Staves.Add(secondStaff);

            score.Staves.Add(new Staff());
            score.ThirdStaff.Elements.Add(Clef.Tenor);
            score.ThirdStaff.Elements.Add(new Key(0));
            score.ThirdStaff.Elements.Add(new Note(Pitch.D4, RhythmicDuration.Half));
            score.ThirdStaff.Elements.Add(new Note(Pitch.E4, RhythmicDuration.Half));
            score.ThirdStaff.Elements.Add(new Barline());

            score.Staves.Add(new Staff());
            score.Staves[3].Elements.Add(Clef.Bass);    //0-based index
            score.Staves[3].Elements.Add(new Key(0));
            score.Staves[3].Elements.Add(new Note(Pitch.G3, RhythmicDuration.Half));
            score.Staves[3].Elements.Add(new Note(Pitch.C3, RhythmicDuration.Half));
            score.Staves[3].Elements.Add(new Barline());

Zwróć uwagę na różne sposoby wstawiania elementów na pięciolinię.

 

Kolejnym krokiem będzie import z pliku MusicXml:

var parser = new MusicXmlParser();
            score = parser.Parse(XDocument.Load(@"D:\Dokumenty\Manufaktura programów\Dane do bazy\2014-08-01 DWOK tom 1 numery 1 i 5\DWOK tom 1, s. 3, nr 1 a.xml"));
Data = score;

Ustawmy jeszcze parametr IsPanoramaMode="False" na kontrolce. Parametr ten oznacza, że uwzględniane będzie łamanie systemów. Efekt będzie wyglądał następująco:

W następnym tutorialu omówimy wykorzystanie kontrolek Manufaktury w aplikacjach ASP.NET MVC.