2012-03-14 15 views
7

Voglio disegnare una linea su una griglia WPF.Disegna linea e spostalo a livello di programmazione

private void InitializeTestline() 
{ 
    testline = new Line(); 
    grid.Children.Add(testline); 
    testline.X1 = 0; 
    testline.X2 = 1; 
    testline.Y1 = 0; 
    testline.Y2 = 1; 
    testline.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; 
    testline.VerticalAlignment = System.Windows.VerticalAlignment.Top; 
    testline.Stroke = Brushes.Red; 
    testline.Stretch = Stretch.Fill; 
    testline.StrokeThickness = 2; 
    testline.Visibility = System.Windows.Visibility.Visible; 
} 

Viene disegnato senza problemi. Ma ora voglio aggiungere quattro pulsanti alla griglia (su, giù, sinistra, destra). Quindi quando premo uno dei pulsanti la linea dovrebbe spostarsi nella direzione che scelgo.

private void MoveUp_Click(object sender, RoutedEventArgs e) 
{ 
    this.testline.Y1 += move; 
    this.testline.Y2 += move; 
} 

Questa era la funzione che voglio utilizzare per questo, ma non funziona. Quindi, come è possibile spostare questa linea?

In fine ho un gui come un vecchio terminal3270 e questi gui hanno un accenno. le linee dovrebbero essere come un mirino (e aiutare a vedere dove è effettivamente il cursore)

+0

Siamo spiacenti, ho erroneamente pensato che tu stia parlando di WPF DataGrid – Flot2011

+2

Prova a commentare //testline.Stretch = Stretch.Fill; – Klaus78

+0

Grazie, funzionerà bene ora! Sai perché non funziona con Stretch? – Pippl

risposta

3

In primo luogo, non vorrei manipolare le coordinate in quanto sono principalmente per la definizione della forma della linea. In secondo luogo, non utilizzerei Canvas, ma Render Transformation, in quanto potenzialmente può essere eseguito su GPU anziché su CPU, il che rende l'animazione più fluida.

quindi vorrei fare qualcosa di simile:

XAML:

<Grid x:Name="LayoutRoot"> 

    <Line x:Name="crosshair" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Top" 
      Stroke="Red" 
      X1="0" 
      X2="0" 
      Y1="10" 
      Y2="0" /> 

    <Button Width="50" 
      Height="50" 
      HorizontalAlignment="Right" 
      Click="MoveRight" 
      Content="&gt;" /> 
</Grid> 

Codice Dietro:

public partial class MainWindow : Window 
    { 
     private int moveRightDist = 0; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void MoveRight(object sender, RoutedEventArgs e) 
     { 
      this.moveRightDist++; 
      crosshair.RenderTransform = new TranslateTransform(this.moveRightDist, 0); 
     } 
    } 

<Grid x:Name="LayoutRoot"> 

    <Line x:Name="crosshair" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Top" 
      Stroke="Red" 
      X1="0" 
      X2="0" 
      Y1="10" 
      Y2="0" /> 

    <Button Width="50" 
      Height="50" 
      HorizontalAlignment="Right" 
      Click="MoveRight" 
      Content="&gt;" /> 
</Grid> 

Importante! Se si definisce la matrice di trasformazione Affine in XAML e la si anima, a un certo punto WPF sostituirà l'istanza di tale matrice e se si fa riferimento a tale matrice nel codice, potrebbe non essere possibile manipolare un oggetto.

Nota a margine: avrei preferito creare tutti gli elementi dell'interfaccia utente in XAML (Blend è un ottimo strumento per questo) e poi userei fare riferimento a loro dal codice dietro.

-1

stavo facendo la stessa cosa di base solo su un labirinto, e questo è quello che vorrei fare

private void Move_Up Click(object sender, RoutedEventArgs e) 
{ 
    Point testlinelocation; 
    testlinelocation = testline.Y1; 
    testlinelocation.Offset(someX, someY); 
    testlinelocation = testline.Y1; 
} 

Questo dovrebbe funzionare, ha funzionato per me, buona fortuna Questo è in WinForms