Tag Archives: Mimbolovecmdradio
Для демонстрации возможностей console framework я долго думал над тем, чтобы написать какое-нибудь небольшое приложение, которые с одной стороны было бы достаточно функциональным (чтобы продемонстрировать возможности тулкита), а с другой – максимально простым (чтобы показать, как просто с этим тулкитом работать). Рассматривались варианты блокнота, телефонной книжки итд, но недавно я увидел проект cmdradio и понял, что это именно то, что нужно – достаточно завернуть консольный плеер радио в приятный простой UI, и даже писать ничего не придётся. Благо код оригинальной программы был настолько прост, что состоял из одного файла в 400 строк. И вот за пару дней была написана обёртка над ней – cmdradio-visual. Выглядит это следующим образом:
А кода буквально пара строк:
<Window Title="cmdradio" xmlns:x="http://consoleframework.org/xaml.xsd" xmlns:cmdradio="clr-namespace:cmdradio;assembly=cmdradio" MaxWidth="80"> <Panel> <Panel Orientation="Horizontal"> <GroupBox Title="Genres"> <Panel Orientation="Vertical"> <ComboBox ShownItemsCount="20" MaxWidth="30" SelectedItemIndex="{Binding Path=SelectedGenreIndex, Mode=OneWayToSource}" Items="{Binding Path=Genres, Mode=OneWay}"/> <Panel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,1,0,0"> <TextBlock Text="Volume"/> <cmdradio:VolumeControl Percent="{Binding Path=Volume}" Margin="1,0,0,0" Width="20" Height="1"/> </Panel> </Panel> </GroupBox> <GroupBox Title="Control"> <Panel Margin="1"> <Button Name="buttonPlay" Caption="Play" HorizontalAlignment="Stretch"/> <Button Name="buttonPause" Caption="Pause" HorizontalAlignment="Stretch"/> <Button Name="buttonStop" Caption="Stop" HorizontalAlignment="Stretch"/> <Button Name="buttonExit" Caption="Exit" HorizontalAlignment="Stretch"/> </Panel> </GroupBox> </Panel> <TextBlock HorizontalAlignment="Stretch" Text="{Binding Path=Status, Mode=OneWay}"/> </Panel> </Window> |
WindowsHost windowsHost = ( WindowsHost ) ConsoleApplication.LoadFromXaml( "cmdradio.WindowsHost.xml", null ); PlayerWindowModel playerWindowModel = new PlayerWindowModel( ); Window playerWindow = (Window)ConsoleApplication.LoadFromXaml("cmdradio.PlayerWindow.xml", playerWindowModel); Player player = new Player( ); playerWindow.FindChildByName< Button >( "buttonPlay" ).OnClick += ( sender, eventArgs ) => { player.cmd = new string[] { "play", ( string ) playerWindowModel.Genres[playerWindowModel.SelectedGenreIndex] }; player.Play(); }; playerWindow.FindChildByName< Button >( "buttonPause" ).OnClick += ( sender, eventArgs ) => { player.ReadCmd( new string[] {"pause"} ); }; playerWindow.FindChildByName< Button >( "buttonStop" ).OnClick += ( sender, eventArgs ) => { player.ReadCmd( new string[] {"stop"} ); }; playerWindow.FindChildByName< Button >( "buttonExit" ).OnClick += ( sender, eventArgs ) => { ConsoleApplication.Instance.Exit( ); }; windowsHost.Show( playerWindow ); foreach ( string s in player.GetGenres( )) { playerWindowModel.Genres.Add( s ); } playerWindowModel.PropertyChanged += ( sender, eventArgs ) => { if ( eventArgs.PropertyName == "Volume" ) { player.ReadCmd( new string[] { "volume", string.Format( "{0}", playerWindowModel.Volume ) }); } }; playerWindowModel.Status = player.Status; player.PropertyChanged += ( sender, eventArgs ) => { if ( eventArgs.PropertyName == "Status" ) { playerWindowModel.Status = player.Status; } }; ConsoleApplication.Instance.Run(windowsHost); |
По-моему, ещё никогда писать TUI-приложения не было так просто. Архив с программой можно скачать здесь.
0