2011-05-21 11 views
10

Czy istnieje składnik paska znacznika dla aplikacji C#, co mógłbym użyć w mojej aplikacji? Jak pasku markera mam na myśli coś ReSharper dodaje do Visual Studio: enter image description herePasek znaczników do aplikacji C#?

Innym przykładem czegoś podobnego (na pasku po lewej): enter image description here

EDIT: Znalazłem non-free komponent java http://www.sideofsoftware.com/marker_bar/doc/sos/marker/JMarkerBar.html co dokładnie robi to, co chcę zrobić. Nie nadaje się dla mnie, ale może pomaga komuś.

+0

Z jakiej technologii korzystasz? WinForm, WPF, ...? –

+0

Cóż, po prostu robiąc badania, tak naprawdę nie zaplanowałem jeszcze czego używać. Może być jednym z nich. – hs2d

+0

Byłoby zbyt trudno utworzyć go w WPF (dla mnie), ale wiele zależy od tego, jakiego rodzaju funkcji potrzebujesz (np. Czy powinno być klikalne?) –

Odpowiedz

5

W WPF pasek jest trochę jak ListBox z innym sposobem wyświetlania 1-pikselowego wysokiego wiersza dla każdej linii tekstu. Stan linii wpływałby na kolor linii, a wybór linii spowodowałby zmianę zdarzenia SelectionChanged, na które pole tekstowe mogłoby odpowiedzieć.

Daj mi znać, jeśli chcesz, abym pokazał prototyp.

EDIT

Tu idzie. Możesz kliknąć/wybrać linię na pasku, a pole tekstowe zostanie przewinięte do tej linii.

Jeszcze dodać:

  1. co zrobić, gdy liczba wierszy jest duże w stosunku do baru?

  2. Inny sposób wyświetlania linii na pasku?

  3. Zachowaj wybraną linię na pasku zsynchronizowaną z symbolem w polu tekstowym.

  4. ...

te można rozwiązać, ale w dużej mierze zależy, co chcesz. To powinno zacząć.

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

Prototyp byłby niezły. – hs2d

+0

@ hs2d, dodałem przykład. Zobacz moją odpowiedź. –

+0

musiał zmienić xaml: , a następnie kod C#: case VersionStatus. Oryginał: return "Green"; .. itd. Aby to działało. – hs2d

3

Można użyć klasy Graphics na panelu, aby go pomalować samemu.

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

(nie będę używać wykres słupkowy jak sugeruje Teoman Soygul, że to nadużywanie komponenty za coś, czego nie mają robić. To samo z ideą listbox Erno. Lista skrzynie są do pokazywania linie tekstu, a nie paski znaczników.)

+0

To byłoby najlepsze rozwiązanie, ale nie używałem go wcześniej, więc nie mam pojęcia, jak to zrobić. – hs2d

+1

ListBoxes w WPF może pokazać wszystko, co chcesz. Obrazy, słowa, kształty, linie. Po co budować od zera, gdy wszystko, czego potrzebujesz, jest tam, nawet nie nadużywając listbox. W rzeczywistości ListBox pokazuje tekst, ale po prostu używa innej reprezentacji. –

Powiązane problemy