2011-11-08 3 views
1

텍스트 상자가 있고 "일반"텍스트 상자보다 높습니다. 텍스트 상자의 "첫 번째 행"을 클릭하면 텍스트를 입력 할 수 있습니다. 어떻게하면 텍스트 상자의 아무 부분이나 클릭하여 커서를 가져올 수있게 할 수 있습니다. 5 행의 텍스트 상자가 있고 텍스트를 입력하기 위해 첫 줄을 클릭해야하는 경우 꽤 어려울 수 있습니다."첫 번째 행"에서 텍스트 상자 만 클릭 가능

<StackPanel Orientation="Vertical" Margin="0,0,15,0"> 
     <TextBlock x:Name="lblObjective" Text="Objective" Style="{StaticResource TextBlockStyle}" VerticalAlignment="Center"></TextBlock> 
     <TextBox x:Name="Objective" Text="{Binding ObjectiveText, Mode=TwoWay}" TextWrapping="Wrap" Height="120" Width="500"></TextBox> 
</StackPanel> 

편집 :

내 응용 프로그램의 모든 텍스트 상자에 영향을주는 서식 파일입니다. 누군가가 내가 대신 내가 전체 템플릿 모두를 제거하면 첫 번째 줄

<Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="TextBox"> 
       <Grid x:Name="RootElement"> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal"/> 
          <VisualState x:Name="MouseOver"> 
           <Storyboard> 
            <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="FocusRectangle" /> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Disabled"> 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="DisabledVisualElement"> 
             <SplineDoubleKeyFrame KeyTime="0" Value="1"/> 
            </DoubleAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="ReadOnly"> 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ReadOnlyVisualElement"> 
             <SplineDoubleKeyFrame KeyTime="0" Value="1"/> 
            </DoubleAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="FocusStates"> 
          <VisualState x:Name="Focused"> 
           <Storyboard> 
            <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="FocusRectangle" /> 
            <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="FocusInnerRectangle"/> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Unfocused"> 
           <Storyboard/> 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="ValidationStates"> 
          <VisualState x:Name="Valid"/> 
          <VisualState x:Name="InvalidUnfocused"> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
             <DiscreteObjectKeyFrame KeyTime="0"> 
              <DiscreteObjectKeyFrame.Value> 
               <Visibility>Visible</Visibility> 
              </DiscreteObjectKeyFrame.Value> 
             </DiscreteObjectKeyFrame> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="InvalidFocused"> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
             <DiscreteObjectKeyFrame KeyTime="0"> 
              <DiscreteObjectKeyFrame.Value> 
               <Visibility>Visible</Visibility> 
              </DiscreteObjectKeyFrame.Value> 
             </DiscreteObjectKeyFrame> 
            </ObjectAnimationUsingKeyFrames> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="validationTooltip"> 
             <DiscreteObjectKeyFrame KeyTime="0"> 
              <DiscreteObjectKeyFrame.Value> 
               <sys:Boolean>True</sys:Boolean> 
              </DiscreteObjectKeyFrame.Value> 
             </DiscreteObjectKeyFrame> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <Rectangle x:Name="Base" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="{TemplateBinding BorderThickness}" Opacity="1" Fill="{StaticResource ControlBackgroundBrush}" /> 
        <Rectangle x:Name="FocusRectangle" StrokeThickness="{TemplateBinding BorderThickness}" Opacity="0" Stroke="{StaticResource TextBoxMouseOverBorderBrush}" /> 
        <Rectangle x:Name="FocusInnerRectangle" StrokeThickness="{TemplateBinding BorderThickness}" Opacity="0" Margin="1" Stroke="{StaticResource TextBoxMouseOverInnerBorderBrush}" /> 
        <Grid Margin="0,1,0,0"> 
         <Border x:Name="ReadOnlyVisualElement" Background="{StaticResource ReadOnlyBrush}" Opacity="0"/> 
         <Grid > 
          <ScrollViewer x:Name="ContentElement" BorderThickness="0" IsTabStop="False" Margin="4,0,2,2" VerticalAlignment="Top" Background="{x:Null}"/> 
         </Grid> 
        </Grid> 
        <Rectangle x:Name="DisabledVisualElement" Stroke="{StaticResource ControlsDisabledBrush}" StrokeThickness="{TemplateBinding BorderThickness}" Fill="{StaticResource ControlsDisabledBrush}" IsHitTestVisible="False" Opacity="0"/> 
        <Border x:Name="ValidationErrorElement" BorderBrush="{StaticResource ControlsValidationBrush}" BorderThickness="1" Visibility="Collapsed"> 
         <ToolTipService.ToolTip> 
          <ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Template="{StaticResource ValidationToolTipTemplate}"> 
           <ToolTip.Triggers> 
            <EventTrigger RoutedEvent="Canvas.Loaded"> 
             <BeginStoryboard> 
              <Storyboard> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip"> 
                <DiscreteObjectKeyFrame KeyTime="0"> 
                 <DiscreteObjectKeyFrame.Value> 
                  <sys:Boolean>true</sys:Boolean> 
                 </DiscreteObjectKeyFrame.Value> 
                </DiscreteObjectKeyFrame> 
               </ObjectAnimationUsingKeyFrames> 
              </Storyboard> 
             </BeginStoryboard> 
            </EventTrigger> 
           </ToolTip.Triggers> 
          </ToolTip> 
         </ToolTipService.ToolTip> 
         <Grid Background="Transparent" HorizontalAlignment="Right" Height="12" Margin="1,-4,-4,0" VerticalAlignment="Top" Width="12"> 
          <Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="{StaticResource ValidationBrush5}" Margin="1,3,0,0"/> 
          <Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="{StaticResource WhiteColorBrush}" Margin="1,3,0,0"/> 
         </Grid> 
        </Border> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 

를 클릭 할 필요없이 캐럿을 텍스트 상자의 아무 곳이나 클릭하고 여전히 얻을 수 있도록 추가 할 필요가 무슨 말을 할 수 것은 잘 작동 (즉, 어디든지 나는 carret를 얻는 textbox를 클릭한다.) 그러나 나머지는 또한 잃어버린다. 그래서 나는 어떤 아이디어라도 놓치고 있습니까?

편집 2 :

<ScrollViewer x:Name="ContentElement" BorderThickness="0" IsTabStop="False" Margin="4,0,2,2" VerticalAlignment="Top" Background="{x:Null}"/> 

+1

멀티 라인으로 만들 계획입니까? 'AcceptsReturn = "True"'를 설정하면 도움이 될 것입니다. – vcsjones

답변

0

아니에요 ... 대신 VerticalAlignment="Stretch"이 맨 위로 설정하고 이에 대한 한 줄 클릭했다가 필요없이 ... 문제의 근본이었다 당신이 뭘보고 있지만 그 텍스트 상자에 아무 곳이나 클릭하면 입력 포커스를 제공하므로 편집을 시작할 수 있다는 것을 알게되었습니다 (BTW는 상태가 AcceptsReturn에 상관없이 켜져 있어야합니다).

그러나 상자에서 클릭하는 장소가 현재 문자열 값의 끝을 초과하면 캐럿은 클릭 한 장소가 아닌 콘텐츠의 끝에 배치됩니다. 이것은 일반적인 텍스트 상자 동작으로, stackoverflow의 텍스트 상자에서이 부분을 입력하면 같은 동작을합니다.

TexBox에서 아무 곳이나 입력하려면 mousedown의 텍스트 위치를 감지하고 적절한 공백을 주입해야합니다. 사소한 문제는 아닙니다.

+0

문제는 텍스트 상자에 영향을주는 암시적인 스타일이었습니다. 나는 첫 번째 라인을 클릭하면 아무 것도 입력 할 수 없었습니다. 그렇지 않으면 아무 일도 없었습니다. 이제 어딘가를 클릭하면 캐럿이 마지막 문자로 이동합니다. –

관련 문제