WPF Отправка сообщения чата, содержащего гиперссылку

У меня небольшая проблема, я создал систему сообщений приватного чата, используя C#. Теперь мне нужен способ отправить интерактивную ссылку другому человеку.

Выбирая человека из списка, я нажимаю кнопку приглашения, и в окно сообщений приходит сообщение типа «Пользователю1: присоединиться из этого ссылка на сайт»

private void InvBtn_Click(object sender, RoutedEventArgs e)
{
    selectedUser = UsersListBox.SelectedItem.ToString();
    if (selectedUser != login)
    {
        MessageBox.Show("Select other user than yourself");
        return;
    }
    else
    {               
        Msg.Text = selectedUser + " join from this 'link' ";
    }
}

После отправки другой человек получает сообщение в RichTextBox, в котором говорится:

От пользователя2: присоединяйтесь к этому ссылка на сайт

Нет необходимости открывать веб-сайт, но есть другая форма, где будет более подробная информация.

В чем именно заключается ваш вопрос? Как встроить интерактивные элементы в текстовые прогоны? Как найти URL-адреса в строках? Как открыть второе окно? Является ли "мне нужен способ отправить гиперссылку другому человеку" релевантной частью?

Manfred Radlwimmer 27.03.2018 14:32

Вопрос был немного неудачно разработан. Но мне нужен способ отправить ссылку другому человеку, который открывает второе окно. Гиперссылка не так актуальна. @ManfredRadlwimmer

phändä 27.03.2018 14:39

Хорошо, я понимаю, но какая часть этого доставляет вам проблемы? Вы, конечно, не просто остановили свою разработку и решили вместо этого спросить о StackOverflow. Какая часть этого процесса блокирует ваш прогресс? Также: эта «гиперссылка», вероятно, должна быть просто разметкой, которая на самом деле не является гиперссылкой (как в ссылках на что-то в Интернете), а просто каким-то специально отформатированным фрагментом текста, верно? (или существует ли взаимодействие любой с задействованным веб-сервером? - этот пример google.fi на самом деле не объясняет это)

Manfred Radlwimmer 27.03.2018 14:41

Да, это не обязательно должна быть гиперссылка на веб-сайт. Но да, это должен быть своего рода специально отформатированный текст, на который можно щелкнуть. В основном проблема заключается в отправке этой «ссылки» другому человеку, по которому он может перейти. @ManfredRadlwimmer

phändä 27.03.2018 14:51

Хорошо, я понимаю - вы уже используете какую-то разметку для своего чата, например, жирный шрифт, курсив или до сих пор все это был чистый текст?

Manfred Radlwimmer 27.03.2018 14:51

Все теперь просто текст, без жирного шрифта или курсива. @ManfredRadlwimmer

phändä 27.03.2018 14:55

Возможно, я смогу написать небольшой пример для чего-то подобного, скоро вернусь.

Manfred Radlwimmer 27.03.2018 14:55

Отметьте этот ответ: stackoverflow.com/a/20179317/8507673

sTrenat 27.03.2018 15:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
8
172
2

Ответы 2

Вам необходимо создать настраиваемый MessageBox с кнопкой гиперссылки.

Попробуйте это, здесь вам нужно правильно установить свойства высоты и ширины ... и заставить конструктор принимать аргументы, чтобы пользователи могли проектировать его так, как они хотят.

 public class CustomMessageBox
    {
        public CustomMessageBox()
        {
            Window w = new Window();
            DockPanel panel = new DockPanel();
            TextBlock tx = new TextBlock();
            Paragraph parx = new Paragraph();
            Run run1 = new Run("Text preceeding the hyperlink.");
            Run run2 = new Run("Text following the hyperlink.");
            Run run3 = new Run("Link Text.");
            Hyperlink hyperl = new Hyperlink(run3);
            hyperl.NavigateUri = new Uri("http://search.msn.com");
            tx.Inlines.Add(hyperl);
            panel.Children.Add(tx);
            w.Content = panel;
            w.Show();
        }
    }

Источник: https://social.msdn.microsoft.com/Forums/vstudio/en-US/57fcd28b-6e9e-4529-a583-892c8f6d7cc8/hyperlink-in-wpf-message-box?forum=wpf

Сначала вам нужно придумать способ включения вашей специальной разметки в текстовое сообщение. Вы можете либо упаковать все сообщение в существующий формат контейнера (XML, JSON и т. д.), Либо для простоты добавить в текст специальные маркеры, например:

Hi User1, join from [This link:12345].

Таким же образом вы можете включить разметку для других вещей, таких как смелый (**bold**), курсив (*italics*) или фактических гиперссылок на веб-сайты.

С другой стороны, вам понадобится парсер, который обнаруживает эту специальную разметку и заменяет ее интерактивной ссылкой. В следующем примере я использую Regex для поиска и замены всего текста в формате [Text:Command].

private IEnumerable<Inline> Parse(string text)
{
    // Define the format of "special" message segments
    Regex commandFinder = new Regex(@"\[(?<text>.+)\:(?<command>.+)]");

    // Find all matches in the message text
    var matches = commandFinder.Matches(text);

    // remember where to split the string so we don't lose other 
    // parts of the message
    int previousMatchEnd = 0;

    // loop over all matches
    foreach (Match match in matches)
    {
        // extract the text fore it
        string textBeforeMatch = text.Substring(previousMatchEnd, match.Index - previousMatchEnd);
        yield return new Run(textBeforeMatch);

        previousMatchEnd = match.Index + match.Length;

        // extract information and create a clickable link
        string commandText = match.Groups["text"].Value;
        string command = match.Groups["command"].Value;

        // it would be better to use the "Command" property here,
        // but for a quick demo this will do
        Hyperlink link = new Hyperlink(new Run(commandText));
        link.Click += (s, a) => { HandleCommand(command); };

        yield return link;
    }

    // return the rest of the message (or all of it if there was no match)
    if (previousMatchEnd < text.Length)
        yield return new Run(text.Substring(previousMatchEnd));
}

В методе, в котором вы получаете сообщение, вы можете просто интегрировать его следующим образом:

// Where you receive the text
// This probably is just a `txtOutput.Text += ` until now
private void OnTextReceived(string text)
{
    txtOutput.Inlines.AddRange(Parse(text));
}

// the method that gets invoked when a link is clicked
// and you can parse/handle the actual command
private void HandleCommand(string command)
{
    MessageBox.Show("Command clicked: " + command);
}

Сообщение Hi User1, join from [this link:1234567890] отобразится как Hi User1, join from this link и вызовет HandleCommand("1234567890") при нажатии.

Другие вопросы по теме