2013-03-29 1 views
4

RichTextBoxComboBox이 포함 된 Grid로 구성된 매우 간단한 WPF 창을 만들었습니다. 나는 RichTextBox 선택의 폰트 크기를 바꾸고 찾아보기 위해 ComboBox을 사용합니다.ComboBox를 통한 RichTextBox Selection의 글꼴 크기 변경이 제대로 작동하지 않습니다.

  1. MyTextBox_SelectionChanged은 선택의 글꼴 크기와 ComboBox를 업데이트 : 여기에 두 가지가 있습니다

    public partial class MainWindow : Window 
    { 
        public MainWindow() 
        { 
         InitializeComponent(); 
    
         // Add the font sizes. 
         for (var i = 1; i < 72; i++) 
         { 
          FontSize.Items.Add((double) i); 
         } 
        } 
    
        private void MyTextBox_SelectionChanged(object sender, RoutedEventArgs e) 
        { 
         // If the selection changes, update the font size in the ComboBox. 
         FontSize.SelectedValue = (double) MyTextBox.Selection.GetPropertyValue(TextBlock.FontSizeProperty); 
        } 
    
        private void FontSize_SelectionChanged(object sender, SelectionChangedEventArgs e) 
        { 
         // If the selected size changes, change the size of the selection in the RichTextBox. 
         if (FontSize.SelectedItem != null) 
          MyTextBox.Selection.ApplyPropertyValue(TextBlock.FontSizeProperty, FontSize.SelectedItem); 
        } 
    } 
    

    :

    여기 내 XAML의 코드 숨김 파일입니다.

  2. FontSize_SelectionChanged은 선택 항목의 글꼴 크기를 변경합니다.

당신은 아래의 문제를 볼 수 있습니다

enter image description here

내가 선택하고 글꼴 크기를 변경, 그것은 완벽하게 변경합니다. 그러나 다른 글꼴 크기로 다른 텍스트를 클릭하는 순간 다시 바뀝니다.

이 동작의 원인은 무엇입니까? 편집

:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ComboBox x:Name="FontSize" HorizontalAlignment="Left" VerticalAlignment="Top" Width="497" Margin="10,10,0,0" SelectionChanged="FontSize_SelectionChanged"/> 
     <RichTextBox x:Name="MyTextBox" HorizontalAlignment="Left" Height="273" VerticalAlignment="Top" Width="497" Margin="10,37,0,0" RenderTransformOrigin="0.358,0.48" SelectionChanged="MyTextBox_SelectionChanged"> 
      <FlowDocument> 
       <Paragraph> 
        <Run Text="RichTextBox"/> 
       </Paragraph> 
      </FlowDocument> 
     </RichTextBox> 

    </Grid> 
</Window> 

편집 : 2 : 여기는 XAML 파일의 여기에 내가 한 일의 짧은 설명이 때 나는 그것을 디버깅 된 두 디버그 포인트는

  1. 있습니다 하나는 MyTextBox_SelectionChanged이고 하나는 FontSize_SelectionChanged입니다.
  2. 글꼴 크기를 변경하면 F5를 클릭하고 계속 진행합니다.
  3. 기본 크기를 가진 텍스트의 다른 부분을 클릭하면 MyTextBox_SelectionChanged이 호출됩니다. Selection.Text이 비어 있습니다.
  4. 그런 다음 다시 전화를 걸어 FontSize_SelectionChanged으로 전화하십시오. 그러나 여전히 Selection.Text은 비어 있지만 이전의 "Rich"선택 항목은 이전 글꼴 크기로 되돌아갑니다.

편집 3 :이 문제는 2008 년 7 월 Sams Teach Yourself WPF in 24 Hours 처음으로 인쇄에서 언급, 135 페이지, "을 예상대로 텍스트 편집기 작업 만들기"항목 9.이 설명을 이해하고 창조하지 않았다 특정 문제를 보여주는 짧은 샘플.

+0

게시 한 코드는 (적어도 내 컴퓨터에서는) 언급 한 문제를 일으키지 않습니다. 그래서 문제를 일으키는 다른 코드입니다. 또한 MyTextBox_SelectionChanged 코드와 다른 문제가 있습니다. 사용자가 글꼴 크기가 여러 개인 텍스트 (예 : RichTex)를 선택하면 예외가 발생합니다. – publicgk

+0

@publicgk : 문제를 일으킬 수있는 다른 코드는 없습니다. 'MainWindow.xaml'은'FontSize'라는 이름의 ComboBox와'MyTextBox'라는 이름의 RichTextBox가 있습니다. 그리고 내가 게시 한 것은 네임 스페이스 선언을 제외하고'MainWindow.xaml.cs' 파일에있는 모든 것입니다. 이 문제는 제가 읽고있는 책에서 언급 되었기 때문에 아무런 문제가 발생하지 않을 것 같지 않습니다. 그리고 책의 설명을 이해할 수 없기 때문에 여기에서 설명했습니다. – hattenn

+0

@publicgk : 그리고이 문제를 언급하기 위해이 코드를 특별히 작성했기 때문에 언급 한 다른 문제는 문제가되지 않습니다. 그것보다 다른 어떤 상황도 처리하지 않았다. – hattenn

답변

2

당신은 선택을 취소합니다 할 때, 이것은 Selection 빈 선택 (즉, 단지 삽입 포인트)를 나타내는 동안 TextBox.SelectionChanged 이벤트 핸들러 (MyTextBox_SelectionChanged)가 호출되도록한다는 것이다. 핸들러는 비어있는 선택의 글꼴 크기를 사용하여 콤보 상자의 SelectedValue을 설정합니다. 이는 비어있는 선택 항목이더라도 비할 바가 없습니다. (삽입 포인터는 여전히 글꼴 크기를가집니다.) SelectedValue을 변경하면 물론 ComboBox.Selection 이벤트 처리기 (FontSize_SelectionChanged)가 실행됩니다. 이 이벤트 핸들러는 사용자가 새 값을 선택하여 발생하는 이벤트와 SelectedValue 속성을 변경하는 코드로 인해 발생하는 이벤트를 쉽게 구별 할 수 없기 때문에 선택 영역의 글꼴 크기를 수정하려고 시도합니다. 아마도이 특별한 경우에하고 싶지 않을 것입니다.

그렇다고해도 선택이 비어 있고 글꼴 크기를 이미 글꼴 크기가되도록 설정하려고 시도하기 때문에 괜찮다고 생각할 수 있습니다. 그러나 이상한 점이 있습니다 :이 빈 선택에서 ApplyPropertyValue으로 전화하면 전체 문서에 대해 FontSize을 설정하는 것으로 보입니다.

선택을 취소하면 코드가 전체 문서의 글꼴 크기를 클릭 한 지점의 글꼴 크기와 같게 설정합니다.

ApplyPropertyValue의 버그로 생각됩니다. 처음에 선택한 텍스트가 첫 번째 문자부터 시작하여 왼쪽에서 오른쪽으로 드래그하여 선택되는 경우에만 발생하기 때문에 발생합니다. 그런 다음 다시 빈 항목에 서식을 적용 할 경우 어떤 동작을 의미하는지 명확하지 않습니다. 아마도 WPF에서 확실한 버그를 치는 것보다는 정의되지 않은 동작을 호출하는 것일 수도 있습니다. 어떤 경우

는이 문제를 해결하는 합리적인 방법은 콤보 상자 변경 핸들러를 수정하는 것입니다 : 선택 영역이 비어 있지 않은 경우

if (FontSize.SelectedItem != null && !MyTextBox.Selection.IsEmpty) 
{ 
    MyTextBox.Selection.ApplyPropertyValue(
     TextBlock.FontSizeProperty, FontSize.SelectedItem); 
} 

이 유일한 시도 선택의 글꼴 크기를 변경할 수 있습니다.

+0

감사합니다 이안, 가능할 때 현상금을 수여 할 것입니다 (15 시간 동안 다시 할 수 없음). 그건 그렇고, 문제는 왼쪽에서 오른쪽으로뿐만 아니라 내 시스템에서 선택을하는 방향에 관계없이 발생합니다. – hattenn

0

텍스트를 선택한 다음 메뉴에서 크기를 변경하면 더 이상 선택 항목이 보이지 않아도 코드가 선택됩니다. 코드를 선택하면 MyTextBoxSelection이 변경되기 전에 SelectionChanged 메서드가 실행됩니다. 나는 그저 그런 문제가 있었다고 생각한다.) 이제 Fontsize 및 Fontsize 메서드를 변경하여 업데이트되지 않은 Selection에 액세스하여 마지막 변경 내용을 void로 만듭니다.일어나고있는 것 같다 무엇

+0

하지만'선택 '을 디버그 포인트로 확인하면 비어있는 것처럼 보입니다. 왜 아직도 변합니까? – hattenn

관련 문제