2011-02-11 21 views
8

guys Çok satırlı bir metni DataGridTextColumn içine girmek istiyorum, çok satırlı karakter girmek için "enter" kullanabilirim. Ama görsel stüdyo kaynak yöneticisi gibi "shift + enter" kullanmak istiyorum, burada "enter" tuşu ile benim kodum. Bunu yapmanınWPF: DataGrid çok satırlı metni nasıl girebilirim

<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*"> 
    <DataGridTextColumn.ElementStyle> 
     <Style TargetType="TextBlock"> 
     <Setter Property="TextWrapping" Value="Wrap" /> 
     </Style> 
    </DataGridTextColumn.ElementStyle> 
    <DataGridTextColumn.EditingElementStyle> 
     <Style TargetType="TextBox"> 
     <Setter Property="TextWrapping" Value="Wrap" /> 
     <Setter Property="AcceptsReturn" Value="true" /> 
     </Style> 
    </DataGridTextColumn.EditingElementStyle> 

cevap

13

bir yolu Stil bir EventSetter kullanarak TextBox KeyDown olayı ele gereğidir. Örneğinizi aldım, AcceptsReturn belirleyicisini stilde kaldırdım ve CaretIndex'i sağa doğru hareket ettirip yeni bir satır ekleyen EditingElementStyle'a bir KeyDown işleyicisi ekledim. işte,

<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*"> 
    <DataGridTextColumn.ElementStyle> 
     <Style TargetType="TextBlock"> 
      <Setter Property="TextWrapping" Value="Wrap" /> 
     </Style> 
    </DataGridTextColumn.ElementStyle> 
    <DataGridTextColumn.EditingElementStyle> 
     <Style TargetType="TextBox"> 
      <Setter Property="TextWrapping" Value="Wrap" /> 
      <EventSetter Event="KeyDown" Handler="OnTextBoxKeyDown"/> 
     </Style> 
    </DataGridTextColumn.EditingElementStyle> 
</DataGridTextColumn> 

Yeni Uygulama projesi şablondan Pencere sınıfında örnek yazdığı olay işleme kodu ile tüm Window C# var:

İşte XAML bu. Bu durumda düzenleme satırına bir taahhüt olarak ele alınmasını Geri Dönme tuşunun kullanılmasını istemediğimden, olayın her yerde kabarcıklandırılmasını engellemek için Handled'i true olarak ayarladığımı unutmayın. Bence bu aslında yaklaşımın olumsuz taraflarından biri. Bir olayın köpürme/tünellemesini durdurmak, uygulamanızda kullanıcı girdisi ile karmaşık etkileşimleriniz varsa, kolayca bir mantık bombasına dönüşebilir. Ama böyle tek bir vakanız varsa çok da kötü değil. Her şeyde olduğu gibi, bunu kullanarak UI'nizin parçası büyüdükçe dikkatli kullanın. dikkate almak

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new List<Thing> 
     { 
      new Thing { Value = "Some text" }, 
      new Thing { Value = "More text" + Environment.NewLine + " second line" }, 
      new Thing { Value = "Another value" } 
     }; 
    } 

    private void OnTextBoxKeyDown(object sender, KeyEventArgs e) 
    { 
     if (Key.Return == e.Key && 
      0 < (ModifierKeys.Shift & e.KeyboardDevice.Modifiers)) 
     { 
      var tb = (TextBox)sender; 
      var caret = tb.CaretIndex; 
      tb.Text = tb.Text.Insert(caret, Environment.NewLine); 
      tb.CaretIndex = caret + 1; 
      e.Handled = true; 
     } 
    } 
} 

public class Thing 
{ 
    public string Value { get; set; } 
} 

bir diğer şey insert tuşuna basılmış olması durumunda biçimi farklı isteyebilirsiniz olduğunu ve geçersiz kılma giriş modu bulunmaktadır. Belki bu durumda, sonraki karakter yeni hat ile değiştirilmelidir. Ancak Visual Studio 2010'daki kaynak editörü, insert anahtarına tepki vermiyor gibi görünüyor (aynı zamanda metni çok satırlı olarak göstermiyor). Ama bence bu örnekte, ekleme anahtarı ile iyi çalışacak şekilde genişletebilirsiniz. Umarım bu yardımcı olur - iyi şanslar!

+0

Merhaba timmyl, çok teşekkürler. Ve yolunuzu alıp metin kutusundan miras almayı denedim ve sorunumu çözdüğünüz için çok teşekkür ederim. – yafeya

+0

Kalıtsallık güzeldir, çünkü bu, tür grafiğinde TextBox'tan ayrılma maliyetiyle bunu temiz bir şekilde kapsüllemenizi sağlar. İhtiyacınız olup olmadığını kontrol etmek isteyebileceğiniz tip ağacına yeni bir düğüm koymadan bu olay işlemeyi kapsaymanın alternatif bir yolu (yalnızca tabi olduğunuz kadar karmaşık hale getirin) davranışı eklemek için ekli bir özellik kullanıyor ve Bir mülkün kullanımı mülkünüzün abonesi/un-subscript olayını yapmak için değiştirdi. Harika olan şey, bu mantığın sadece TextBox'tan (diğer türetilmiş kontroller gibi) daha fazla yeniden kullanılabileceğidir. En iyi dileklerimle. – timmyl

+0

Evet, bu şekilde bana metin kutusunun mantığını genişletmenin basit bir yolunu sunabilir, bu çok iyi. – yafeya

6

Seti TextWrapping sarın ve AcceptsReturn = Doğru ... Cevabınız için

<DataGridTextColumn.EditingElementStyle> 
    <Style TargetType="TextBox"> 
    <Setter Property="TextWrapping" Value="Wrap" /> 
    <Setter Property="AcceptsReturn" Value="true" /> 
    </Style> 
</DataGridTextColumn.EditingElementStyle>