2014-02-24 1 views
1

C# WinForms 응용 프로그램에 RTF 상자가 있습니다.RichTextBox에서 기울임 꼴 설정/해제

기본 스타일을 설정하는 것은 매우 간단하지만 이탤릭체 스타일을 설정 해제하려고하면 선택 글꼴에 적용된 다른 스타일이 모두 사라집니다.

if (rtf.SelectionFont.Style.HasFlag(FontStyle.Italic)) 
{ 
    rtf.SelectionFont = new Font(rtf.SelectionFont.FontFamily, rtf.SelectionFont.Size, rtf.SelectionFont.Style | FontStyle.Regular); 
} 
else 
{ 
    rtf.SelectionFont = new Font(rtf.SelectionFont.FontFamily, rtf.SelectionFont.Size, rtf.SelectionFont.Style | FontStyle.Italic); 
} 

굵게, 밑줄 등을 잃지 않고 기울임 꼴 속성을 선택 취소하는 방법이 있습니까?

+2

FontStyle.Regular는 0이지만 아무 것도 변경하지 않습니다. [this answer] (http://stackoverflow.com/a/3153514/17034)와 같이 ~ 연산자를 사용해야합니다. –

+0

'&'및'~'연산자가 함께 작동하지만 _have to_는 과장되어 있습니다 - [TMTOWTDI] (http://en.wikipedia.org/wiki/TMTOWTDI), [ "감자, 감자, 토마토, 토마토" ] (http://answers.yahoo.com/question/index?qid=20100307223452AAAez19) – J0e3gan

+0

[SubSupport (FontStyle에서 가져 오기) \ [C# \]]에서 중복 될 수 있음 (http://stackoverflow.com/) 질문/4198429/substract-flag-from-fontstyle-toggling-fontstyles-c) –

답변

1

제거하기 위해 OR보다는 XOR을 사용하여 하나의 FontStyle - 예를 들어,이 구현

private void btnBold_Click(object sender, EventArgs e) 
{ 
    var currentStyle = rtf.SelectionFont.Style; 
    var newStyle = 
     rtf.SelectionFont.Bold ? 
     currentStyle^FontStyle.Bold : 
     currentStyle | FontStyle.Bold; 

    rtf.SelectionFont = 
     new Font(
      rtf.SelectionFont.FontFamily, 
      rtf.SelectionFont.Size, 
      newStyle); 
} 

private void btnItalic_Click(object sender, EventArgs e) 
{ 
    var currentStyle = rtf.SelectionFont.Style; 
    var newStyle = 
     rtf.SelectionFont.Italic ? 
     currentStyle^FontStyle.Italic : 
     currentStyle | FontStyle.Italic; 

    rtf.SelectionFont = 
     new Font(
      rtf.SelectionFont.FontFamily, 
      rtf.SelectionFont.Size, 
      newStyle); 
} 

, 다른 영향을주지 않습니다 굵게 또는 기울임 꼴 스타일을 제거 스타일에 이미 적용되어있는 경우에만 적용됩니다.

보너스 :

의 스타일을 변경 한 후 선택을 다시 선택과 같은 추가 고려 사항, 오래된 DevX tip of the day 당신이 너무 관심을 수 있습니다.

또한 스타일 제공 핸들러에서 제공하는 일반적인 로직은 스타일 관련 핸들러가 활용할 수있는 도우미 메소드로 분해되기를 간청합니다. private ChangeStyle(FontStyle style).

+0

흥미 롭습니다. 고마워. 나는 이것도 시도 할 것이다. – IEnumerable

2

열거 형을 반복하고 스타일을 다시 결합해야합니다. 다음과 같은 뭔가 :

FontStyle oldStyle = rtf.SelectionFont.Style; 
FontStyle newStyle = FontStyle.Regular; 
foreach (Enum value in Enum.GetValues(oldStyle.GetType())) 
{ 
    if (oldStyle.HasFlag(value) && !value.Equals(FontStyle.Italic)) 
    { 
     newStyle = newStyle | (FontStyle)value; 
    } 
} 

rtf.SelectionFont = new Font(rtf.SelectionFont.FontFamily, rtf.SelectionFont.Size, newStyle);