2011-05-21 11 views
10

Esiste un componente della barra dell'indice per un'applicazione C# che potrei usare nella mia applicazione? Come barra di selezione voglio dire una cosa del genere ReSharper aggiunge a Visual Studio: enter image description hereBarra di marcatura per l'applicazione C#?

Un altro esempio di qualcosa di simile (la barra a sinistra): enter image description here

EDIT: Ho trovato componente non libero per java http://www.sideofsoftware.com/marker_bar/doc/sos/marker/JMarkerBar.html cosa fa esattamente quello che voglio fare. Non è adatto per me ma forse aiuta qualcuno.

+0

Che tecnologia stai utilizzando? Winforms, WPF, ...? –

+0

Beh, solo fare delle ricerche quindi non è mai stato così adatto a cosa usare. Può essere uno di quelli – hs2d

+0

Sarebbe troppo difficile crearne uno in WPF (per me) ma molto dipende da quale tipo di funzionalità si desidera (ad esempio dovrebbe essere selezionabile?) –

risposta

5

In WPF la barra è un po 'come un ListBox con un modo diverso di visualizzare una linea di 1 pixel per ogni riga di testo. Lo stato della linea influenzerebbe il colore della linea e selezionando una linea si aumenterebbe l'evento SelectionChanged a cui la casella di testo potrebbe rispondere.

Fammi sapere se vuoi che mostri un prototipo.

EDIT

qui va. Puoi fare clic/selezionare una linea nella barra e la casella di testo scorrerà fino a quella linea.

ancora aggiungere:

  1. cosa fare quando il numero di linee è di grandi dimensioni per il bar?

  2. Un modo diverso per mostrare la linea corrente nella barra?

  3. Mantenere la linea selezionata nella barra sincronizzata con il cursore nella casella di testo.

  4. ...

Questi possono essere risolti, ma dipendono in gran parte da quello che vuoi. Questo dovrebbe farti cominciare.

XAML:

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication2" 
     Title="MainWindow" 
     Height="350" 
     Width="525"> 
    <Window.Resources> 
     <local:StatusToBrushConverter x:Key="statusToBrushConverter" /> 
    </Window.Resources> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="30" /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <ListBox ItemsSource="{Binding}" 
       SelectionChanged="ListBox_SelectionChanged"> 
      <ListBox.ItemContainerStyle> 
       <Style TargetType="ListBoxItem"> 
        <Setter Property="HorizontalContentAlignment" 
          Value="Stretch" /> 
        <Setter Property="Opacity" 
          Value="0.5" /> 
        <Setter Property="MaxHeight" 
          Value="1" /> 
        <Setter Property="MinHeight" 
          Value="1" /> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" 
           Value="True"> 
          <Trigger.Setters> 
           <Setter Property="Opacity" 
             Value="1.0" /> 
          </Trigger.Setters> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 

      </ListBox.ItemContainerStyle> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Rectangle StrokeThickness="0" 
           Stroke="Green" 
           Fill="{Binding Status, Converter={StaticResource statusToBrushConverter}}" 
           Height="1" 
           HorizontalAlignment="Stretch" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <TextBox AcceptsReturn="True" 
       Grid.Column="1" 
       x:Name="codeBox" /> 
    </Grid> 
</Window> 

C#:

using System; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Linq; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfApplication2 
{ 
    public partial class MainWindow : Window 
    { 
     private CodeLines lines; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      lines = new CodeLines(); 

      Random random = new Random(); 
      for (int i = 0; i < 200; i++) 
      { 
       lines.Add(new CodeLine { Status = (VersionStatus)random.Next(0, 5), Line = "Line " + i }); 
      } 

      this.DataContext = lines; 

      codeBox.Text = String.Join("\n", from line in lines 
              select line.Line); 
     } 

     private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      var selectedLine = ((ListBox)sender).SelectedIndex; 
      codeBox.ScrollToLine(selectedLine); 
     } 
    } 

    public enum VersionStatus 
    { 
     Original, 
     Added, 
     Modified, 
     Deleted 
    } 

    public class CodeLine : INotifyPropertyChanged 
    { 

     private VersionStatus status; 

     public VersionStatus Status 
     { 
      get { return status; } 
      set 
      { 
       if (status != value) 
       { 
        status = value; 
        OnPropertyChanged("Status"); 
       } 
      } 
     } 

     private string line; 

     public string Line 
     { 
      get { return line; } 
      set 
      { 
       if (line != value) 
       { 
        line = value; 
        OnPropertyChanged("Line"); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      var p = PropertyChanged; 
      if (p != null) 
      { 
       p(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    public class CodeLines : ObservableCollection<CodeLine> 
    { 
    } 


    class StatusToBrushConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      var status = (VersionStatus)value; 
      switch (status) 
      { 
       case VersionStatus.Original: 
        return Brushes.Green; 
       case VersionStatus.Added: 
        return Brushes.Blue; 
       case VersionStatus.Modified: 
        return Brushes.Yellow; 
       case VersionStatus.Deleted: 
        return Brushes.Red; 
       default: 
        return DependencyProperty.UnsetValue; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 
+0

Prototipo sarebbe bello. – hs2d

+0

@ hs2d, ho aggiunto un esempio. Vedi la mia risposta. –

+0

ha dovuto modificare xaml: e quindi il codice C#: case VersionStatus. Originale: restituire "Verde"; .. ecc. Per farlo funzionare. – hs2d

3

Si potrebbe utilizzare la classe Graphics su un pannello a dipingere da soli.

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx

(non vorrei usare un grafico a barre come suggerito Teoman Soygul, che è abusando componenti per qualcosa che non sono tenuti a fare. Lo stesso con l'idea listbox da Erno. Le caselle di riepilogo sono fatti per mostrare righe di testo, non barre dell'indicatore.)

+0

Questo sarebbe la soluzione migliore, ma non l'ho usato prima quindi non ho idea di come farlo. – hs2d

+1

I ListBox in WPF possono mostrare qualsiasi cosa tu voglia. Immagini, parole, forme, linee. Perché costruire da zero quando tutto ciò che serve è lì senza nemmeno abusare della listbox. In effetti, il ListBox mostra il testo ma usa solo una rappresentazione diversa. –

Problemi correlati