Silverlight est très différent du système de disposition basé sur console que vous utilisiez. Je considère que Silverlight est simple dans de nombreux cas, mais ce n'est certainement pas un bon remplacement d'une interface utilisateur qui utilise printf et des caractères positionnés en absolu.
Je voudrais vraiment vous suggère de passer par quelques-uns de ces tutoriels:
http://www.silverlight.net/learn/quickstarts/
Voici une de bout en bout par exemple cependant d'une simple, console comme l'application que j'ai jeté ensemble (rudimentaire au mieux). Il y a beaucoup de façons d'accomplir ce que j'ai fait ci-dessous.
Il montre une façon d'accéder aux éléments de l'interface utilisateur, indirectement, à partir d'une autre classe. Je suggère de ne pas exposer directement les éléments de l'interface utilisateur à d'autres classes comme je le démontre.
<UserControl x:Class="SL1Test.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" FontSize="16"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="Black">
<Grid.RowDefinitions>
<!-- Give first row max height -->
<RowDefinition Height="*"/>
<!-- Give second row as little as needed-->
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!--A giant textblock, in a scrolling area-->
<ScrollViewer
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto">
<TextBlock x:Name="tbMyConsole" Foreground="Green"
FontFamily="Courier New" FontWeight="Bold"/>
</ScrollViewer>
<Grid Grid.Row="1" >
<Grid.ColumnDefinitions>
<!-- Give first column max width -->
<ColumnDefinition Width="*"/>
<!-- Give second column as little as needed-->
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="txtConsoleInput" Foreground="Green" Background="Black"
SelectionForeground="Black"
CaretBrush="Green"
SelectionBackground="YellowGreen"/>
<Button Grid.Column="1" x:Name="btnSend">Send</Button>
</Grid>
</Grid>
</UserControl>
Et le C# code-behind:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace SL1Test
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
btnSend.Click += new RoutedEventHandler(btnSend_Click);
txtConsoleInput.KeyUp += new KeyEventHandler(txtConsoleInput_KeyUp);
AutoTicker ticker = new AutoTicker("AutoTicker", this);
}
void txtConsoleInput_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
e.Handled = true;
ProcessSend();
}
}
void btnSend_Click(object sender, RoutedEventArgs e)
{
ProcessSend();
}
private void ProcessSend()
{
string input = txtConsoleInput.Text;
ProcessInput(input);
txtConsoleInput.Text = "";
}
public void ProcessInput(string input)
{
if (!string.IsNullOrWhiteSpace(input))
{
input = DateTime.Now.ToLocalTime() + "> " + input + "\n";
tbMyConsole.Text = tbMyConsole.Text + input;
txtConsoleInput.Text = "";
}
}
}
}
Et enfin, une deuxième classe qui envoie les résultats à la première classe:
using System;
using System.Windows.Threading;
namespace SL1Test
{
public class AutoTicker
{
private MainPage _page;
private string _caption;
public AutoTicker(string caption, MainPage page)
{
this._page = page;
this._caption = caption;
// start a timer to send back fake input
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(2);
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
_page.ProcessInput(string.Format("{0} @ {1}",
this._caption,
DateTime.Now.ToLongTimeString()));
}
}
}
comment puis-je accéder à cette TextBlock? Supposons que je l'ai dans ... alors, comment puis-je changer le texte? –
Pijusn
TxtMsg.Text = "Ceci est un autre texte"; – Notter
Il dit qu'il n'existe pas dans le contexte actuel. J'ai déjà essayé ça. J'ai MainPage.xaml et * .cs + BaseObject.cs. J'essaie d'accéder à cette zone de texte à partir de BaseObject. J'ai remarqué que cela fonctionne dans l'objet MainPage mais pas dans le BaseObject. Dois-je coder une fonction renvoyant une référence ou existe-t-il un meilleur moyen? – Pijusn