Здравствуйте, VladD2, Вы писали:
GR>>А может передавать в этот хинт XAML-разметку? Это почти как HTML только для WPF-движка. VD>Вопрос только насколько быстро? Не будет тормозить при этом вывод хинта?
Здесь поможет только эксперимент.
GR>>Кодбихайнд там скорее всего не нужен будет, а создать UIElement из XAML — очень просто. VD>Нам нужна реакция на события (переход по ссылке). Но ее лучше делать во внешнем коде.
В WPF вроде как можно декларативно делать привязку к командам, правда я сам этого не делал, т.к. пишу под SilverLight (урезанный WPF).
То есть реализовать команду можно в коде, а привязку к ней сделать в XAML. Только вот не думаю, что удобно будет эти привязки во входном XAML задавать.
Реально XAML — разметка графа объектов. Так вот можно определить свою иерархию объектов, которые описывают хинт, а конкретный хинт описывать не XML-ем, а XAML-ом, т.к. есть стандартный способ преобразовать XAML в реальный граф объектов. Сам XAML наверно можно будет генерить StringTemplate-ом.
Например если имеется XAML
Здравствуйте, VladD2, Вы писали:
VD>Не понимаю в чем сложност. Задача фактически вылевается в трансформацию хмл.
Только сейчас понял, что код вида
<p>test <bold>test</bold> test</p>
не корректен для XML и спроецировать его через LINQ2XLM не получится...
Видимо придется писать свой мини-парсер?
J>>Не понял, это ты про Win32? Я на WPF вроде делаю... VD>WPF не в вакууме живет. В итоге он будет хоститься в некотором окне Windows.
Думаю окно владелец в WPF не понадобится...
J>>Нужно, чтобы это был WFP'шный UIElement. VD>Вовсе нет! Нам нужно окно-владелец для окна в котором бубет хоститься WPF-контрол. VD>Так что это могут быть обычные окна Windows.
Это не контрол, а окно, так что хостить его не надо.
Здравствуйте, jenyavb, Вы писали:
J>Здравствуйте, gloomy rocker, Вы писали:
GR>>Здравствуйте, jenyavb, Вы писали:
J>>>"что-то вроде HTML-я (но сильно упрощенного)" — не думаю, что это хороший способ задания текста, нужен будет парсер этого синтаксиса, да и генерировать текст из кода будет сложнее. Проще создавать какое-либо дерево с форматированным текстом.
GR>>А может передавать в этот хинт XAML-разметку? Это почти как HTML только для WPF-движка. Кодбихайнд там скорее всего не нужен будет, а создать UIElement из XAML — очень просто.
J>XAML — это ИМХО больше чем нужно... Тогда можно будет любую разметку туда загнать... А нужно наоборот ограничить.
Согласен, но вариант с XML и HTML — это еще больше, чем нужно.
Здравствуйте, gloomy rocker, Вы писали:
J>>XAML — это ИМХО больше чем нужно... Тогда можно будет любую разметку туда загнать... А нужно наоборот ограничить. GR>Согласен, но вариант с XML и HTML — это еще больше, чем нужно.
Если есть способ ограничить XAML лишь своими элементами, то можно и попробовать... Потому как с XML есть проблема
Здравствуйте, jenyavb, Вы писали:
J>Здравствуйте, gloomy rocker, Вы писали:
J>>>XAML — это ИМХО больше чем нужно... Тогда можно будет любую разметку туда загнать... А нужно наоборот ограничить. GR>>Согласен, но вариант с XML и HTML — это еще больше, чем нужно.
J>Если есть способ ограничить XAML лишь своими элементами, то можно и попробовать... Потому как с XML есть проблема
. Так-же нужно подумать, как обрабатывать нажатия на ссылки.
Если ограничения в рантайме будет достаточно, то этого вполне можно добиться, определив свою иерархию объектов. По сути XAML — это средство определения графа объектов, что собственно и нужно. А из каких объектов будет состоять этот граф — нам решать.
То есть если есть метод:
public static NemerleHint ParseXaml(string xaml)
{
...
}
То ошибка будет либо при загрузке XAML в случае, если будет передан кривой XAML, либо при приведении object к NemerleHint, если передан правильный XAML, но описывающий не NemerleHint.
Если же нужна проверка в компайлтайме, то XML/HTML/XAML — вообще тупиковый вариант.
Здравствуйте, gloomy rocker, Вы писали:
GR>Если ограничения в рантайме будет достаточно, то этого вполне можно добиться, определив свою иерархию объектов. По сути XAML — это средство определения графа объектов, что собственно и нужно. А из каких объектов будет состоять этот граф — нам решать.
Так, а как собственно парсить Xaml? То-есть какие классы/методы для этого использовать?
GR>Если же нужна проверка в компайлтайме, то XML/HTML/XAML — вообще тупиковый вариант.
Здравствуйте, jenyavb, Вы писали:
J>Так, а как собственно парсить Xaml? То-есть какие классы/методы для этого использовать?
Для этого есть класс XamlReader
Т.е. для парсинга XAML нужно сделать что-то типа такого:
public class NemerleHint
{
public static NemerleHint Parse(string hintXaml)
{
using(var sr = new StringReader(hintXaml))
using(var xr = new XmlTextReader(sr))
return (NemerleHint)XamlReader.Load(xr);
}
}
Еще есть перегруженный метод Load, который принимает аргумент типа ParserContext. Возможно, придется с ним поколдовать...
GR>>Если же нужна проверка в компайлтайме, то XML/HTML/XAML — вообще тупиковый вариант. J>Достаточно и в рантайме....
Ок. Тогда либо XamlReader.Load ругнется, к стати вполне культурно и понятно, либо приведение типа object к NemerleHint.
Здравствуйте, VladD2, Вы писали:
J>>Только сейчас понял, что код вида J>>
J>><p>test<bold>test</bold> test</p>
J>>
J>>не корректен для XML и спроецировать его через LINQ2XLM не получится... J>>Видимо придется писать свой мини-парсер? VD>С чего ты это сзвзял? Это совершенно корректный XML.
Хм... Может я чего-то не знаю, но как же вытаскивать линком выделенные жирным подстроки? Заворочивать их в ещё один вид тегов?
VD>Кстати, тег болд должен быть определяемый, а не фиксированный.
Я понимаю. Там все теги, кроме p, ref и hint — получается определяемые.
Здравствуйте, jenyavb, Вы писали:
J>Хм... Может я чего-то не знаю, но как же вытаскивать линком выделенные жирным подстроки? Заворочивать их в ещё один вид тегов?
А что там делать то?
Грузишь XML через XElement и разбираешь if-ами что получилось.
Для этой задачи XSLT за глаза хватило бы.
Задача ведь на трансформивание.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>А что там делать то? VD>Грузишь XML через XElement и разбираешь if-ами что получилось. VD>Для этой задачи XSLT за глаза хватило бы. VD>Задача ведь на трансформивание.
Ещё раз повторяю:
<p>test1 <bold>test2</bold> test3</p>
В таком коде подстроки "test1 " и " test3" не являются xml-элементами, поэтому через XElement.Elements() они не вытащатся, а просто пропустятся.
Ещё хотел спросить, нужно ли реализовывать задержку перед показом тултипа или это будет делаться из вне?
Здравствуйте, jenyavb, Вы писали:
J>Ещё раз повторяю: J>
J><p>test1 <bold>test2</bold> test3</p>
J>
J>В таком коде подстроки "test1 " и " test3" не являются xml-элементами, поэтому через XElement.Elements() они не вытащатся, а просто пропустятся.
Ты лучше бы не теоретизировал, а попробовал бы:
using System;
using System.Xml.Linq;
class Program
{
static void Main()
{
var str = "<p>test1 <bold>test2</bold> test3</p>";
var xml = XElement.Parse(str);
Console.WriteLine("Parsed XML: " + xml);
foreach (var node in xml.DescendantNodes())
Console.WriteLine("Node type: {0,7} Value: '{1}'", node.NodeType, node);
}
}
Elements() возвращает только XElement-ы, т.е. теги. Но кроме XElement-ов есть еще и текстовые ветки (и куча других).
J>Ещё хотел спросить, нужно ли реализовывать задержку перед показом тултипа или это будет делаться из вне?
Задержек никаких не надо. Надо сосредоточиться на автоматическом закрытии по таймеру и на выравнивании размеров под текст и доступный объем места на экране.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, jenyavb, Вы писали:
J>Хм... Может я чего-то не знаю, но как же вытаскивать линком выделенные жирным подстроки? Заворочивать их в ещё один вид тегов?
Здравствуйте, VladD2, Вы писали:
VD>Ты лучше бы не теоретизировал, а попробовал бы: VD>Elements() возвращает только XElement-ы, т.е. теги. Но кроме XElement-ов есть еще и текстовые ветки (и куча других).
уже подсказали.
J>>Ещё хотел спросить, нужно ли реализовывать задержку перед показом тултипа или это будет делаться из вне? VD>Задержек никаких не надо. Надо сосредоточиться на автоматическом закрытии по таймеру и на выравнивании размеров под текст и доступный объем места на экране.
Здравствуйте, jenyavb, Вы писали:
VD>>Еще нужен тег <code> или <pre> который бы выводил текст моноширинным шрифтом.
J>А почему для него отдельный тег? Его ведь тоже стилем можно сделать.
Можно, если стили будут поддерживать дополнение. Тег <code> должен задавать только шнифт.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
AddStileTag() — позволяет задать теги стилей.
Show() — позволяет показать хинт на экране.
activeArea — это область экрана при выходе из которой нужно автоматически скрывать хинт. Естесвтенно, что если курсор вошел в хинт, то хинт скрывать не надо.
showAt — это координата где нужно отображать хинт. X задает смешение от верха экрана где должна находиться верхняя граница хинта. Y задает горизонтальную точку относительно которой нужно выравнивать хинт. Если хинт влезает в окно, то он должен начинаться н с координаты Y. Если он выходит за пределы окна, то хинт может сдвигаться влево, вплоть до левого края окна.
text — текст хинта размеченый тегами.
action — делегат который должен вызываться в случае если пользователь нажал на активную область. В единственный строковый параметр делегата должна передоваться строка заданная в теге ref (чтобы можно было понять что за ссылка нажата.
Если Show вызван в то время когда открыт хинт, то хинт не мерцая должен изменить свое содержание. Это нужно, чтобы можно было организовать нечто вроде гипертекстовой навигации. Скажем нажал я в хинте описывающем метод на нектороый тип и в хинте должено отобразиться описание этого типа.
Кстати, логично было бы предусмотреть маленькую кнопку (в углу хинта) навигации назад (так чтобы она была видна если задан некий флаг).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>В общем, мне нужен класс с приблизительно следующим описанием:
VD>enum ThreeState VD>{ VD> | NoDefined VD> | Set VD> | Unset VD>}
VD>
class AdvancedHint
{
public AdvancedHint(
Action<string> linkClickedNotifyer,
Func<string, string> subHintGetter,
IDictionary<string, Func<Span>> styles)
public void Show(Rectangle targetRect, string hintText)
public void Hide()
}
linkClickedNotifyer — делегат, для оповещения о клике на ссылку
subHintGetter — делегат, получающий содержимое вложенного хинта. есть еще простые хинты с указанием текста по месту, но без форматирования.
styles — словарь, с делегатами-фабриками Span'ов — текстовых элементов WPF (это и есть кастом-теги)
showAt у меня нет, ибо позиция курсора и так известна.
VD>Если Show вызван в то время когда открыт хинт, то хинт не мерцая должен изменить свое содержание. Это нужно, чтобы можно было организовать нечто вроде гипертекстовой навигации. Скажем нажал я в хинте описывающем метод на нектороый тип и в хинте должено отобразиться описание этого типа. VD>Кстати, логично было бы предусмотреть маленькую кнопку (в углу хинта) навигации назад (так чтобы она была видна если задан некий флаг).