开发者

WPF Page navigation

开发者 https://www.devze.com 2023-03-25 18:12 出处:网络
I use a custom textblock in my WPF Application, when I use it in WPF Windows it worked good but when I use it in a WPF Page it make a problem. When I click on a link in my Custom Control it browse the

I use a custom textblock in my WPF Application, when I use it in WPF Windows it worked good but when I use it in a WPF Page it make a problem. When I click on a link in my Custom Control it browse the link and show in browser but the WPF page navigate back to another WPF Page too (first page)

namespace Dtwitter.Controls
{

public class TweetTextBlock : TextBlock
{

    public TweetTextBlock()
    {

    }

    #region Dependency properties

    public string TweetText
    {
        get { return (string)GetValue(TweetTextProperty); }
        set { SetValue(TweetTextProperty, value); }
    }

    // Using a DependencyProperty as the backing store for TweetText.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TweetTextProperty =
        DependencyProperty.Register("TweetText", typeof(string), typeof(TweetTextBlock),
        new FrameworkPropertyMetadata(string.Empty, new PropertyChangedCallback(OnTweetTextChanged)));

    #endregion



    private static void OnTweetTextChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        string text = args.NewValue as string;
        if (!string.IsNullOrEmpty(text))
        {
            TweetTextBlock textblock = (TweetTextBlock)obj;
            textblock.Inlines.Clear();
            textblock.Inlines.Add(" ");

            string[] words = Regex.Split(text, @"([ \(\)\{\}\[\]])");

            string possibleUserName = words[0].ToString();

            if ((possibleUserName.Length > 1) && (possibleUserName.Substring(1, 1) == "@"))
            {
                textblock = FormatName(textblock, possibleUserName);
                words.SetValue("", 0);
            }

            foreach (string word in words)
            {
                // clickable hyperlinks
                if (UrlShorteningService.IsUrl(word))
                {
                    try
                    {
                        Hyperlink link = new Hyperlink();
                        link.NavigateUri = new Uri(word);
                        link.Inlines.Add(word);
                        link.Click += new RoutedEventHandler(link_Click);
                        link.ToolTip = "Open link in the default browser";
                        textblock.Inlines.Add(link);
                    }
                    catch
                    {
                        //TODO:What are we catching here? Why? Log it?
                        textblock.Inlines.Add(word);
                    }
                }
                // clickable @name
                else if (word.StartsWith("@"))
                {
                    textblock = FormatName(textblock, word);

                }

                // clickable #hashtag
                else if (word.StartsWith("#"))
                {
                    string hashtag = String.Empty;
                    Match foundHashtag = Regex.Match(word, @"#(\w+)(?<suffix>.*)");
                    if (foundHashtag.Success)
                    {
                        hashtag = foundHashtag.Groups[1].Captures[0].Value;
                        Hyperlink tag = new Hyperlink();
                        tag.Inlines.Add(hashtag);

                        string hashtagUrl = "http://search.twitter.com/search?q=%23{0}";

                        // The main application has access to the Settings class, where a
                        // user-defined hashtagUrl can be stored.  This hardcoded one that
                        // is used to set the NavigateUri is just a default behavior that
                        // will be used if the click event is not handled for some reason.

                        tag.NavigateUri = new Uri(String.Format(hashtagUrl, hashtag));
                        tag.ToolTip = "Show statuses that include this hashtag";
                        tag.Tag = hashtag;

                        tag.Click += new RoutedEventHandler(hashtag_Click);

                        textblock.Inlines.Add("#");
                        textblock.Inlines.Add(tag);
                        textblock.Inlines.Add(foundHashtag.Groups["suffix"].Captures[0].Value);
                    }
                }
                else
                {
                    textblock.Inlines.Add(word);
                }
            }

     开发者_开发百科       textblock.Inlines.Add(" ");
        }
    }

    public static TweetTextBlock FormatName(TweetTextBlock textblock, string word)
    {
        string userName = String.Empty;
        string firstLetter = word.Substring(0, 1);

        Match foundUsername = Regex.Match(word, @"@(\w+)(?<suffix>.*)");

        if (foundUsername.Success)
        {
            userName = foundUsername.Groups[1].Captures[0].Value;
            Hyperlink name = new Hyperlink();
            name.Inlines.Add(userName);
            name.NavigateUri = new Uri("http://twitter.com/" + userName);
            name.ToolTip = "View @" + userName + "'s recent tweets";
            name.Tag = userName;

            name.Click += new RoutedEventHandler(name_Click);

            if (firstLetter != "@")
                textblock.Inlines.Add(firstLetter);

            textblock.Inlines.Add("@");
            textblock.Inlines.Add(name);
            textblock.Inlines.Add(foundUsername.Groups["suffix"].Captures[0].Value);
        }
        return textblock;
    }


    static void link_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            System.Diagnostics.Process.Start(((Hyperlink)sender).NavigateUri.ToString());
        }
        catch
        {
            //TODO: Log specific URL that caused error
            MessageBox.Show("There was a problem launching the specified URL.", "Error", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }

}

}


change your link click method to

static void link_click(Object sender, RequestNavigateEventArgs e) {
    try {
        System.Diagnostics.Process.Start(e.Uri.ToString());
    } catch {
        //TODO: Log specific URL that caused error
        MessageBox.Show("There was a problem launching the specified URL.", "Error", MessageBoxButton.OK, MessageBoxImage.Exclamation);
    } finally {
       e.Handled = true;
    }
}

change your

link.Click+=new RoutedEventHandler(link_Click);

to

link.RequestNavigate+=new RequestNavigateEventHandler(link_Click);

Set e.Handled=true in link_click to mark you've dealt with the link click to prevent the framework from additionally processing your link click further.

Alternatively you may be able to just set the TargetName property of Hyperlink to "_blank" and not need the process start command


The code below should make it work the same way in both cases (Page and Window)....

try this to open the hyperlink in web browser in MouseDown of the Hyperlink object.

    Process.Start((e.OriginalSource as Hyperlink).NavigateUri.ToString());
    e.Handled  = true;

Let me know if this helps.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号