В мою программу включен следующий HtmlTextBlock для библиотеки WPF: http://www.codeproject.com/KB/WPF/htmltextblock.aspx
Теперь у меня есть следующий код, который должен реализовывать HtmlTextBlock:
private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
this.tweeter.Content = twt.User.Username;
//AddHandler(Hyperlink.ClickEvent, (RoutedEventHandler)Hyperlink_Click);
ImageSourceConverter conv = new ImageSourceConverter();
this.tweetImage.Source = (ImageSource)conv.ConvertFromString(twt.User.AvatarURL);
string txt = twt.Text;
Regex regx = new Regex("(http|ftp|https)://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.IgnoreCase);
MatchCollection matches = regx.Matches(txt);
foreach (Match m in matches)
{
int strt = txt.IndexOf(m.Value);
int end = strt + m.Value.Length;
if (strt != -1)
{
txt = txt.Insert(end, "[/a]");
txt = txt.Insert(strt, "[a href=" + m.Value + "]");
}
}
this.tweetText.Html = txt;
string source = "web";
if (twt.SourceName != null)
source = twt.SourceName;
string dateString = twt.DatePosted;
const string format = "ddd MMM dd HH:mm:ss zzzz yyyy";
DateTime my_date = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);
TimeSpan ts = new TimeSpan();
ts = DateTime.Now - my_date;
string date = "date";
// Date Parsing
if (ts.Days > 0)
{
string month = "Mo";
switch (my_date.Month)
{
case 1:
month = "Jan";
break;
case 2:
month = "Feb";
break;
case 3:
month = "Mar";
break;
case 4:
month = "Apr";
break;
case 5:
month = "May";
break;
case 6:
month = "June";
break;
case 7:
month = "July";
break;
case 8:
month = "Aug";
break;
case 9:
month = "Sep";
break;
case 10:
month = "Oct";
break;
case 11:
month = "Nov";
break;
case 12:
month = "Dec";
break;
}
date = String.Format("on {0}, {1} {2}, {3}", my_date.DayOfWeek.ToString(), month, my_date.Day, my_date.Year);
}
else if (ts.Hours > 0)
if (ts.Hours == 1)
date = "1 hour ago";
else
date = string.Format("{0} hours ago", ts.Hours);
else if (ts.Minutes > 0)
if (ts.Minutes == 1)
date = "1 minute ago";
else
date = string.Format("{0} minutes ago", ts.Minutes);
else if (ts.Seconds > 30)
date = string.Format("{0} seconds ago", ts.Seconds);
else
date = "just now";
this.sourceLabel.Content = String.Format("posted {0} from {1}", date, source);
//tweetText.ContextMenu.StaysOpen = false;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Clipboard.SetText(tweetText.Text);
}
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
if (e.OriginalSource is Hyperlink)
{
Process.Start((e.OriginalSource as Hyperlink).NavigateUri.ToString());
e.Handled = true;
}
}
Проблема здесь заключается в том, что при нажатии на одну из гиперссылок программа открыла ссылку в браузере по умолчанию, как определено EventHandlers, показанным в коде.Однако он также открывает элемент управления WebBrowser, встроенный в саму программу.
Я искал исходный код и не нашел ничего, что содержало бы слово «WebBrowser» или что-либо подобное, поэтому я предполагаю, что это не библиотека.
Может ли это быть проблемой WPF?Я делаю что-то неправильно?Это очень расстраивает.
Редактировать: Только что исправили проблему.Это потому, что я использовал ClickEvent вместо RequestNavigateEvent.