2
RTF 텍스트를 Windows Store 응용 프로그램의 RichEditBox 컨트롤에 바인딩하는 데 오랜 시간을 검색했습니다. 심지어 TwoMay Binding Mode에서 작동해야합니다. ...WinRt : RTF 문자열을 RichEditBox에 바인딩
RTF 텍스트를 Windows Store 응용 프로그램의 RichEditBox 컨트롤에 바인딩하는 데 오랜 시간을 검색했습니다. 심지어 TwoMay Binding Mode에서 작동해야합니다. ...WinRt : RTF 문자열을 RichEditBox에 바인딩
... 마지막으로 다음 해결책을 찾았습니다. DependencyProperty RtfText를 사용하여 원래의 RichEditBox 컨트롤에서 상속 된 컨트롤을 만들었습니다.
public class RichEditBoxExtended : RichEditBox
{
public static readonly DependencyProperty RtfTextProperty =
DependencyProperty.Register(
"RtfText", typeof (string), typeof (RichEditBoxExtended),
new PropertyMetadata(default(string), RtfTextPropertyChanged));
private bool _lockChangeExecution;
public RichEditBoxExtended()
{
TextChanged += RichEditBoxExtended_TextChanged;
}
public string RtfText
{
get { return (string) GetValue(RtfTextProperty); }
set { SetValue(RtfTextProperty, value); }
}
private void RichEditBoxExtended_TextChanged(object sender, RoutedEventArgs e)
{
if (!_lockChangeExecution)
{
_lockChangeExecution = true;
string text;
Document.GetText(TextGetOptions.None, out text);
if (string.IsNullOrWhiteSpace(text))
{
RtfText = "";
}
else
{
Document.GetText(TextGetOptions.FormatRtf, out text);
RtfText = text;
}
_lockChangeExecution = false;
}
}
private static void RtfTextPropertyChanged(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
var rtb = dependencyObject as RichEditBoxExtended;
if (rtb == null) return;
if (!rtb._lockChangeExecution)
{
rtb._lockChangeExecution = true;
rtb.Document.SetText(TextSetOptions.FormatRtf, rtb.RtfText);
rtb._lockChangeExecution = false;
}
}
}
이 솔루션은 저에게 효과적 일 수 있습니다. :-)
알려진 문제 : VirtualizingStackPanel.VirtualizationMode = "재활용"에 이상한 행동