2013-08-05 3 views
0

ControlTemplate을 사용자 정의하는 데 문제가 있습니다. TextBox입니다. 아이디어는 텍스트 길이, 글꼴 크기 등과 같이 최대한 유연한 상태를 유지하면서 최대한 적은 사용자 상호 작용을 통해 줄 지어 용지에 텍스트를 자동으로 인쇄하는 것입니다.스크롤을 제한하기 위해 TextBox ControlTemplate을 수정하면 런타임에 속성 설정이 올바르지 않습니다.

이렇게하려면 한 가지 설정이 인쇄 된 선 (종이에 나타나는 선의 위/위쪽). 텍스트 상자 LineHeight을 변경하면 텍스트 아래에 공백이 추가되고 그 위에는 공백이 없으므로 텍스트 아래쪽에있는 공백을 사용하여 텍스트를 아래쪽으로 변환합니다.

이렇게하면 지정된 LineHeight가 텍스트 상자 안의 남아있는 보이는 공간보다 커질 때마다 문제가 발생합니다. 실수로 행의 맨 아래로 스크롤하여 텍스트를 패딩 된 영역으로 위로 스크롤하여 사라지게 할 수 있습니다.

이 문제를 해결하려면 MouseWheel/PgUp/PgDwn 스크롤을 텍스트 상자 내부에서 방지하거나 맨 위 대신 줄의 아래쪽 가장자리를 따라 텍스트를 렌더링하는 방법을 알아야합니다. 스눕 사용

, 난 TextBox 컨트롤 누구 CanContentScroll 속성 ScrollViewer로부터 ParentTemplate 의해 결정되는 ScrollContentPresenter 갖는다 알았다. 응용 프로그램이 실행 중일 때 스누프에서 CanContentScroll의 검사를 취소하면 스크롤 기능이 비활성화되고 원하는대로이 동작을 방지하지만 어떤 이유로 인해 템플릿에 CanContentScroll = False을 지정하면 작동하지 않습니다. 그것은 True입니다.

XAML은 :

<TextBox.Style> 
    <Style TargetType="TextBoxBase"> 
     . . . 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
        <theme:ListBoxChrome x:Name="Bd" . . . > 
         <ScrollViewer x:Name="PART_ContentHost" 
             CanContentScroll="False"/> 
        </theme:ListBoxChrome> 
        . . . 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</TextBox.Style> 

스타일은 스크롤을 비활성화 된 ControlTemplate에 하나의 변화와 마이크로 소프트의 WPFThemes/Aero.NormalColor.xaml에서 직접 올려진다. 배경 색상과 같은 다른 (생략 된) 설정자에 대한 변경이 효과적이었습니다. TextBox에서 스타일을 직접 지정 했으므로 TextBox는 다른 곳에서는 사용되지 않으며 내재 된 스타일보다 먼저 사용되는 스타일을 가정하기 때문에 TextBox에 직접 지정했습니다. 그러나이 작업을 수행 할 수있는 적절한 위치가 아닐 수도 있습니다.

누구나 내가 잘못하고있는 부분을 지적하거나 줄에서 텍스트가 렌더링되는 위치를 변경할 수 있는지 여부를 확인할 수 있습니까?

당신에게

편집 감사합니다 다음은이 텍스트 상자가 실제로는 각하는 몇 가지 질문을 가지고 대출 또는 허가 응용 프로그램으로 종이 양식이 있다고 가정

을하고 무엇을 더 잘 설명입니다 답을 쓸 수있는 3 개의 미리 인쇄 된 선. 텍스트 박스 :

  • 가있는 크기/
  • 3 개 라인
  • 를 포함하도록 설정되고, 전체 응답 영역을 덮도록 위치가 사용자의 폰트 크기, 정렬, 서체 옵션을 제공
  • 자동 공간 선 LineHeight 조정 균일하게 설정하고 Padding을 설정하면 인쇄 된 줄 바로 위의 텍스트가 배치됩니다.
  • 텍스트 입력이 예상보다 길더라도 오버플로가 허용되지 않습니다.줄의 수는 배수로 증가하고 (예 : 두 배, 세 배 등) 글꼴 크기는 제공된 공간에 모든 내용을 깔끔하게 인쇄하려고 조정됩니다 (예 : 인쇄 된 줄이없는 텍스트 줄 없음)

실제로 이것은 매우으로 잘 작동하며 마치 누군가가 이전 Selectric으로 손으로 만든 것처럼 깔끔한 모양을 만듭니다. 유일한 문제는이 우발적 인 스크롤링 문제가 잠시 발생한다는 것입니다.

+0

몇 마디, 무엇이 있어야하며 어떻게 작동해야합니까? –

+0

예. 자세한 내용으로 질문을 수정하겠습니다. – Tom

+0

예. 텍스트 상자 내에서 스크롤을 사용하지 않도록 설정하거나 텍스트 맨 위에 줄 바꿈 대신 텍스트 서식을 지정하는 방법을 배우고 싶습니다. Thanks – Tom

답변

1

아나톨리는 CanContentScroll을 사용하거나 그 이름에도 불구하고 내용의 스크롤을 사용하지 않도록 않지만, 픽셀로 스크롤 및 항목으로 스크롤 사이를 전환한다는 생각 나게 한 후 변경 내 질문의 의미. 하지만 내 의도가 아예 TextBox 내에서 동작을 스크롤 중지, 그리고 지금은 그 문제를 해결하고 또한 중첩 된 ScrollViewers 제거하여 그들을 호스팅 ListBox에 스크롤 동작을 향상 :

먼저, 내가 this blog post을 발견 왜 ScrollViewer을 항상 설명하는 핸들 MouseWheel. ScrollViewer를 서브 클래스 화하여 스크롤하지 않고 무언가로 템플릿의 내용 호스트 요소를 변경할 수없는 이유가 궁금 할 때까지이 작업을 수행하지 않도록 할 수 있습니다. ContentPresenter은 작동하지 않지만 Important Note Box on this MSDN page은 TextBox가 ScrollViewer 또는 AdornerDecorator과 함께 작동한다고 언급했습니다. AdornerDecorator로 전환

는 완벽하게 작동 :

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
      . . . 
      <AdornerDecorator x:Name="PART_ContentHost" 
           ClipToBounds="True" 
           Margin="{Binding GetTextOffset}" 
           /> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

나는 이전과 텍스트의 위치를 ​​기존 텍스트 오프셋 속성에 마진을 결합 할 수 있었고, ClipToBounds 경계 가시 영역에 컨텐츠를. 다른 주요 개선점은 텍스트 상자가 MouseWheel을 더 이상 전달하지 않기 때문에 ListBox의 TextBox 모음을 스크롤하는 것이 예상대로 작동한다는 것입니다. 중첩 된 ScrollViewers는 불쾌합니다.

관련 문제