一種方式是通過處理上使用您的風格的EventSetter文本框的KeyDown事件。我接下你的例子,刪除了樣式中的AcceptsReturn設置器,並向EditingElementStyle添加了一個KeyDown處理器,該處理器向插入的位置添加一個換行符,並將CaretIndex移動到右側。
這裏的XAML:
<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>
我寫的窗口類的例子,從一個新的應用程序項目模板,所以這裏的C#整個窗口的事件處理代碼。請注意,我將Handled設置爲true以阻止事件在任何地方冒泡,因爲我不希望在此情況下將Return鍵作爲對編輯行的提交進行處理。我認爲這實際上是這種方法的缺點之一。如果你的應用程序中的用戶輸入有複雜的相互作用,那麼停止事件的冒泡/隧道就可以很容易地變成邏輯炸彈。但是,如果你只是有一個這樣的特殊情況,它並不是那麼糟糕。因此,與所有內容一樣,謹慎使用,因爲使用此功能的用戶界面部分會增加。
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; }
}
要考慮的另一件事是,如果插入鍵已被按下且您處於覆蓋輸入模式,您可能希望行爲不同。也許在這種情況下,下一個字符應該換成新行。但Visual Studio 2010中的資源編輯器似乎對插入鍵沒有反應(它也不會將文本顯示爲多行)。但我認爲給出這個例子,你可以擴展它以使用插入鍵。希望這有幫助,祝你好運!
嗨,timmyl,非常感謝您的回答。 我已經採取了自己的方式,並試圖從文本框繼承,並解決我的問題,非常感謝你。 – yafeya 2011-02-13 14:51:32