2016-06-29 2 views
0

ich eine „Konsolenemulation“ habe, wie es hier gezeigt wird: https://stackoverflow.com/a/14957478/6518526Select/Kopieren von Text über mehrere Elemente in einem Item

Es gibt keine Interaktivität in meiner Konsole ist, so ist es wirklich nur ein Puffer, der sein wird angezeigt.

So gibt es eine ScrollViewer enthält eine ItemsControl, die TextBlocks enthält. Die ItemsControl erhält ihre Daten über eine Datenbindung an eine beobachtbare Warteschlange, die Zeichenfolgen enthält.

Wie kann dieses Setup erweitert werden, so dass Text wie in einer Konsole ausgewählt/kopiert werden kann?

Ich habe bereits versucht, eine TextBox anstelle der TextBlock zu verwenden, aber das gibt mir nur die Möglichkeit, innerhalb jedes Elements auszuwählen, aber nicht über mehrere der Elemente gleichzeitig.

Ich fand auch diese Lösung hier, die eine Möglichkeit implementiert, Steuerelemente in einem FlowDocument mit Datenbindungen zu füllen: https://msdn.microsoft.com/en-us/magazine/dd569761.aspx. Aber wie es scheint, wird mir dieser Ansatz auch keine Auswahlmöglichkeit über mehrere Punkte geben.

So, ich bin wenig verloren darüber, welche Control in welcher Weise verwendet werden kann, um dies zu erreichen.

+0

Müssen Sie einen Teil eines Gegenstands auswählen, den nächsten und den Teil danach? Oder kannst du mit der diskreten Auswahl von Gegenständen leben, wobei jeder Gegenstand ganz oder gar nicht ausgewählt ist? Wenn Sie erstere verwenden, benötigen Sie eine mehrzeilige Nur-Lese-TextBox (mit Code in Ihrem Ansichtsmodell, um die Auswahl von Zeilen zu verbinden und das Ergebnis als Eigenschaft verfügbar zu machen). Wenn Letzteres, schlage ich eine ListBox vor. In der Tat ist die Join/Multiline-Textbox Sache bei weitem die einfachste Lösung: Sobald Sie die gewünschten Zeilen verbinden, ist der ganze Rest frei. –

+0

wünschenswert ist in der Lage sein, beliebige Auswahlen zu machen, so scheint es die Join/Multiline-Textbox-Sache ist der Weg zu gehen. Können Sie näher erläutern, wie Sie das Teil gemeint haben, in dem Sie die Auswahl von Linien/Expose als Eigenschaft getroffen haben? – ptair

+0

Ich meinte nur, wenn Sie sagen, öffentliche 'ObservableCollection Lines {...}', könnten Sie auch 'public String Text {bekommen {return String.Join (" \ n ", Lines); }} 'mit der entsprechenden Erhöhung von' PropertyChanged' wenn 'Lines' sich ändert. Dann im XAML '' mit entsprechenden anderen Attributen in der Textbox für Multilinearität, etc. etc. –

Antwort

0

Wenn Sie möchten, dass der Benutzer eine beliebige zusammenhängende Teilmenge von Zeichen aus mehreren Textzeilen auswählen und kopieren kann, ist die einfachste Lösung eine mehrzeilige TextBox. In Ihrem Fall würden Sie es schreibgeschützt machen.

Wenn Sie eine ausreichend große Sammlung von Zeilen haben, wird sich das Problem lösen, aber für überschaubare Mengen an Text sollte es in Ordnung sein. Sehen Sie, wie es mit den Fällen geht, mit denen Sie arbeiten.

Wenn Sie Ihren Text als eine Sammlung pflegen, wenn diskrete Linien (die in diesem Fall wie eine gute Idee klingt), können Sie einfach eine Eigenschaft schreiben, die die Zeilen in einer einzigen Saite verbindet, wenn die Lines Sammlung Änderungen:

C#

public MyViewModel() 
{ 
    Lines = new ObservableCollection<String>(); 
} 

private ObservableCollection<String> _lines; 
public ObservableCollection<String> Lines 
{ 
    get { return _lines; } 
    protected set { 
     _lines = value; 
     UpdateText(); 
     _lines.CollectionChanged += _lines_CollectionChanged; 
     OnPropertyChanged("Lines"); 
    } 
} 

private void UpdateText() 
{ 
    Text = String.Join("\n", Lines); 
} 

private void _lines_CollectionChanged(object sender, 
    System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
{ 
    UpdateText(); 
} 

private string _text; 
public String Text { 
    get { return _text; } 
    protected set { 
     _text = value; 
     OnPropertyChanged("Text"); 
    } 
} 

XAML

<Grid> 
    <TextBox 
     Text="{Binding Text}" 
     TextWrapping="Wrap" 
     AcceptsReturn="True" 
     IsReadOnly="True" 
     /> 
</Grid> 

Sie brauchen nicht einmal Ihr eigenes Kontextmenü zu schreiben.

+0

Toll, danke für die ausführliche Antwort. – ptair

Verwandte Themen