2011-01-30 3 views
1

Je démarre un nouveau projet qui utilise Silverlight et j'ai choisi C# comme langue. Jusqu'à présent, je ne fais pas trop bien. Je n'arrive pas à trouver un moyen simple d'imprimer du texte à l'écran en utilisant C#.C# et Silverlight: imprimer le texte

Retour en C++ (j'utilisais OF) Je pouvais simplement charger une police sur un objet et appeler une fonction avec string + position et tout fonctionnait correctement. Silverlight est censé être quelque chose de "simple" donc je suppose qu'il doit y avoir quelque chose comme ça aussi.

Comment faites-vous cela?

Répondre

2

hmm, TextBlock.Text = "hello world";?

+0

comment puis-je accéder à cette TextBlock? Supposons que je l'ai dans ... alors, comment puis-je changer le texte? – Pijusn

+0

TxtMsg.Text = "Ceci est un autre texte"; – Notter

+0

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

0

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())); 
     } 
    } 
} 
Questions connexes