WPF文本框和保留选项卡

时间:2018-11-23 20:16:53

标签: wpf xaml

在保留粘贴文本中的选项卡的同时,是否有一些优雅的方法允许粘贴到AcceptsTab设置为false的WPF TextBox中?

当AcceptsTab为true时,用户将无法使用选项卡移至下一个控件,这是我的用户所不希望的。但是他们希望粘贴的选项卡被当前替换为空格。

谢谢

2 个答案:

答案 0 :(得分:2)

我不确定这是否符合要求,但可以使用,但可能不够理想(例如,右键单击文本框并从上下文菜单中选择“粘贴”)。

请参见Paste Event in a WPF TextBox

在处理Ctrl-V之前将AcceptsTab设置为true,然后在执行以下操作后将其还原:

XAML:

<build>
...
<plugins>
  <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-dependency-plugin</artifactId>
     <executions>
       <execution>
         <goals>
           <goal>copy</goal>
         </goals>
         <configuration>
           <artifactItems>
             <artifactItem>
               <groupId>${dep.groupId}</groupId>
               <artifactId>${dep.artifactId}</artifactId>
               <version>${dep.version}</version>
               <type>nar</type>
               <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>
               <destFileName>${dep.artifactId}-${dep.version}.jar</destFileName>
             </artifactItem>
           </artifactItems>
         </configuration>
       </execution>
     </executions>
  </plugin>
  ...
</plugins>
</build>

C#:

<TextBox AcceptsTab="False"
         Height="200" 
         PreviewKeyDown="TextBox_PreviewKeyDown" 
         KeyUp="TextBox_KeyUp"/>

这可能会变成一种行为,因此可以轻松地将其应用于更多文本框而无需编写代码。

答案 1 :(得分:1)

另一种方法是将AcceptsTab设置为 true 并在按下(Shift)Tab时移动焦点。

好的副作用是,所有复制/粘贴方案仍将起作用,但用户将无法键入选项卡。

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        var textBox = sender as TextBox;
        if (textBox != null)
        {
            var direction =
                e.KeyboardDevice.IsKeyDown(Key.LeftShift) || e.KeyboardDevice.IsKeyDown(Key.RightShift)
                    ? FocusNavigationDirection.Previous
                    : FocusNavigationDirection.Next;
            textBox.MoveFocus(new TraversalRequest(direction));
        }
    }
}