텍스트 상자가 읽기 전용이어야합니다. 그러나 IsReadOnly을 으로 설정하면 커서가 더 이상 나타나지 않으므로 키보드를 사용하여 더 이상 텍스트 상자와 상호 작용할 수 없습니다.보이는 커서가있는 WPF 용 읽기 전용 텍스트 상자 (.NET 3.5)
.NET 4에는 IsReadOnlyCaretVisible 속성이 있지만 .NET 3.5를 사용해야합니다.
좋은 해결책이 있습니까?
감사합니다.
텍스트 상자가 읽기 전용이어야합니다. 그러나 IsReadOnly을 으로 설정하면 커서가 더 이상 나타나지 않으므로 키보드를 사용하여 더 이상 텍스트 상자와 상호 작용할 수 없습니다.보이는 커서가있는 WPF 용 읽기 전용 텍스트 상자 (.NET 3.5)
.NET 4에는 IsReadOnlyCaretVisible 속성이 있지만 .NET 3.5를 사용해야합니다.
좋은 해결책이 있습니까?
감사합니다.
나는 그것을하지, 그것은 연결된 속성을 사용하여 나 자신을 일을 종료 한 다음
사용법 :
<TextBox AttachedProperties:ReadOnlyModeWithCursor.IsModeEnabled="True">
This textbox has some long text and it can't be edited.
</TextBox>
클래스 : 첫 번째 속성이 사용되는 경우 IsReadOnlyCaretVisible
IsReadOnly="True"
IsReadOnlyCaretVisible="True"
에만 작동하여 XAML에서
public static class ReadOnlyModeWithCursor
{
public static readonly DependencyProperty IsModeEnabledProperty = DependencyProperty.RegisterAttached("IsModeEnabled",
typeof(bool),
typeof(ReadOnlyModeWithCursor),
new FrameworkPropertyMetadata(OnModeEnabledChanged));
private static ContextMenu _contextMenuWithCopyOnly = new ContextMenu();
static ReadOnlyModeWithCursor()
{
_contextMenuWithCopyOnly.Items.Add(new MenuItem { Command = ApplicationCommands.Copy });
}
public static bool GetIsModeEnabled(TextBox textBox)
{
if (textBox == null)
{
throw new ArgumentNullException("textBox");
}
return (bool)textBox.GetValue(IsModeEnabledProperty);
}
public static void SetIsModeEnabled(TextBox textBox, bool value)
{
if (textBox == null)
{
throw new ArgumentNullException("textBox");
}
textBox.SetValue(IsModeEnabledProperty, value);
}
private static void NoCutting(object sender, ExecutedRoutedEventArgs e)
{
if (e.Command == ApplicationCommands.Cut)
{
e.Handled = true;
}
}
private static void NoDragCopy(object sender, DataObjectCopyingEventArgs e)
{
if (e.IsDragDrop)
{
e.CancelCommand();
}
}
private static void OnModeEnabledChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
var textBox = (TextBox)dependencyObject;
var isEnabled = (bool)e.NewValue;
if (isEnabled)
{
textBox.PreviewTextInput += textBox_PreviewTextInput;
textBox.PreviewKeyDown += textBox_PreviewKeyDown;
DataObject.AddPastingHandler(textBox, Pasting);
DataObject.AddCopyingHandler(textBox, NoDragCopy);
CommandManager.AddPreviewExecutedHandler(textBox, NoCutting);
// Default context menu has cut & paste, we want only copy.
textBox.ContextMenu = _contextMenuWithCopyOnly;
// Remove if you want to set the style of readonly textboxes via styles
textBox.Background = new SolidColorBrush(Color.FromRgb(240, 240, 240));
}
else
{
textBox.PreviewTextInput -= textBox_PreviewTextInput;
textBox.PreviewKeyDown -= textBox_PreviewKeyDown;
DataObject.RemovePastingHandler(textBox, Pasting);
DataObject.RemoveCopyingHandler(textBox, NoDragCopy);
CommandManager.RemovePreviewExecutedHandler(textBox, NoCutting);
textBox.ClearValue(TextBox.ContextMenuProperty);
textBox.ClearValue(TextBox.BackgroundProperty);
}
}
private static void Pasting(object sender, DataObjectPastingEventArgs e)
{
e.CancelCommand();
}
private static void textBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
//pressing space doesn't raise PreviewTextInput, reasons here http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/446ec083-04c8-43f2-89dc-1e2521a31f6b?prof=required
if (e.Key == Key.Space || e.Key == Key.Back || e.Key == Key.Delete)
{
e.Handled = true;
}
}
private static void textBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
e.Handled = true;
}
}
extracting the templates from .NET 4.0을 시도해보고 .NET 3.5 응용 프로그램에서 사용할 수 있습니다.
너무 많이 조정하지 않고 사용할 수 있기를 바랍니다.
솔루션을 주셔서 감사합니다. 상황에 맞는 메뉴를 제외하고 모든 것이 잘 작동합니다. 전체 메뉴 (잘라 내기, 복사, 붙여 넣기)가 계속 표시됩니다.이 이유가 무엇일까요? – klawusel