protected override void Render () { InlineCollection inlines = Inlines; inlines.Clear (); TwitterStatusViewer v = Owner; if (v == null) return; Status s = v.DataContext as Status; if (s == null) return; Status s1 = s; if (s.RetweetedStatus != null) s = s.RetweetedStatus; FontWeight defWeight = this.FontWeight; RoutedEventHandler defLinkHandler = new RoutedEventHandler (v.Hyperlink_Click); DependencyProperty nameFg = TwitterStatusViewer.NameForegroundProperty; Inlines.Add (v.CreateHyperlink (s.User.ScreenName + " [" + s.User.Name + "]", "/" + s.User.ScreenName, nameFg, defWeight, defLinkHandler)); if (!string.IsNullOrEmpty (s.InReplyToScreenName)) { Inlines.Add (v.CreateTextBlock (" in reply to ", FontWeights.Normal)); Inlines.Add (v.CreateHyperlink ("@" + s.InReplyToScreenName, "/" + s.InReplyToScreenName + (s.InReplyToStatusId == 0 ? string.Empty : "/status/" + s.InReplyToStatusId.ToString ()), nameFg, defWeight, defLinkHandler)); } if (s != s1) { Inlines.Add (v.CreateTextBlock (" retweeted by ", FontWeights.Normal)); Inlines.Add (v.CreateHyperlink ("@" + s1.User.ScreenName, "/" + s1.User.ScreenName, nameFg, defWeight, defLinkHandler)); } if (s.Source != null) { int p1 = s.Source.IndexOf ('>'); int p2 = s.Source.IndexOf ('<', Math.Max (0, p1)); string appName = s.Source; if (p1 >= 0 && p2 > 0) appName = s.Source.Substring (p1 + 1, p2 - p1 - 1); p1 = s.Source.IndexOf ('\"'); p2 = s.Source.IndexOf ('\"', Math.Max (0, p1 + 1)); Inlines.Add (v.CreateTextBlock (" from ", FontWeights.Normal)); if (p1 >= 0 && p2 > 0) { Inlines.Add (v.CreateHyperlink (appName, s.Source.Substring (p1 + 1, p2 - p1 - 1), nameFg, defWeight, defLinkHandler)); } else { Inlines.Add (appName); } } Inlines.Add (v.CreateTextBlock (" (" + s.CreatedAt.ToString ("MM/dd HH:mm:ss") + ")", FontWeights.Normal)); }
protected override void Render() { InlineCollection inlines = Inlines; while (inlines.Count > 1) { inlines.Remove(inlines.LastInline); } TwitterStatusViewer v = Owner; if (v == null) { return; } Status s = v.DataContext as Status; if (s == null) { return; } Status s1 = s; if (s.RetweetedStatus != null) { s = s.RetweetedStatus; } // 改行や連続する空白を削除 string text = s.Text; StringBuilder sb = new StringBuilder(text.Length); int state = 0; for (int i = 0; i < text.Length; i++) { char c = text[i]; if (c == '\r' || c == '\n') { continue; } if (char.IsWhiteSpace(c)) { if (state == 1) { continue; } state = 1; } else { state = 0; } sb.Append(text[i]); } text = sb.ToString(); // Favoriteアイコン ToggleButton favBtn = v.CreateFavoriteButton(s); favBtn.Margin = new Thickness(0, 0, 3, 0); inlines.Add(favBtn); // 名前を追加 RoutedEventHandler defLinkHandler = new RoutedEventHandler(v.Hyperlink_Click); DependencyProperty nameFg = TwitterStatusViewer.NameForegroundProperty; inlines.Add(v.CreateHyperlink(s.User.ScreenName, "/" + s.User.ScreenName, nameFg, FontWeights.Bold, defLinkHandler)); inlines.Add(" "); // 本文を追加 v.CreateTweetBody(text, inlines); // 返信情報を追加 if (!string.IsNullOrEmpty(s.InReplyToScreenName)) { inlines.Add(v.CreateTextBlock(" in reply to ", FontWeights.Normal, nameFg)); inlines.Add(v.CreateHyperlink("@" + s.InReplyToScreenName, "/" + s.InReplyToScreenName + (s.InReplyToStatusId == 0 ? string.Empty : "/status/" + s.InReplyToStatusId.ToString()), nameFg, FontWeights.Bold, defLinkHandler)); } if (s != s1) { inlines.Add(v.CreateTextBlock(" RT by ", FontWeights.Normal, nameFg)); inlines.Add(v.CreateHyperlink("@" + s1.User.ScreenName, "/" + s1.User.ScreenName, nameFg, FontWeights.Bold, defLinkHandler)); } }