У меня небольшая проблема, я создал систему сообщений приватного чата, используя 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: присоединяйтесь к этому ссылка на сайт
Нет необходимости открывать веб-сайт, но есть другая форма, где будет более подробная информация.
Вопрос был немного неудачно разработан. Но мне нужен способ отправить ссылку другому человеку, который открывает второе окно. Гиперссылка не так актуальна. @ManfredRadlwimmer
Хорошо, я понимаю, но какая часть этого доставляет вам проблемы? Вы, конечно, не просто остановили свою разработку и решили вместо этого спросить о StackOverflow. Какая часть этого процесса блокирует ваш прогресс? Также: эта «гиперссылка», вероятно, должна быть просто разметкой, которая на самом деле не является гиперссылкой (как в ссылках на что-то в Интернете), а просто каким-то специально отформатированным фрагментом текста, верно? (или существует ли взаимодействие любой с задействованным веб-сервером? - этот пример google.fi на самом деле не объясняет это)
Да, это не обязательно должна быть гиперссылка на веб-сайт. Но да, это должен быть своего рода специально отформатированный текст, на который можно щелкнуть. В основном проблема заключается в отправке этой «ссылки» другому человеку, по которому он может перейти. @ManfredRadlwimmer
Хорошо, я понимаю - вы уже используете какую-то разметку для своего чата, например, жирный шрифт, курсив или до сих пор все это был чистый текст?
Все теперь просто текст, без жирного шрифта или курсива. @ManfredRadlwimmer
Возможно, я смогу написать небольшой пример для чего-то подобного, скоро вернусь.
Отметьте этот ответ: stackoverflow.com/a/20179317/8507673





Вам необходимо создать настраиваемый 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();
}
}
Сначала вам нужно придумать способ включения вашей специальной разметки в текстовое сообщение. Вы можете либо упаковать все сообщение в существующий формат контейнера (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") при нажатии.
В чем именно заключается ваш вопрос? Как встроить интерактивные элементы в текстовые прогоны? Как найти URL-адреса в строках? Как открыть второе окно? Является ли "мне нужен способ отправить гиперссылку другому человеку" релевантной частью?