Строка WPF Resources.resx с гиперссылкой? - PullRequest
7 голосов
/ 28 января 2011

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

Текст предварительной гиперссылки href текст гиперссылки Текст пост-гиперссылки.

Затем создайте его в xaml через:

<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Right">
    <TextBlock Grid.Column="1" Text="{x:Static p.Resources.PreHText}" />
    <Hyperlink Grid.Column="1" NavigateUri="{x:Static p.Resources.HHref}">
    <TextBlock Text="{x:Static p.Resources.HText}" /></Hyperlink></TextBlock>
    <TextBlock Grid.Column="1" Text="{x:Static p.Resource.PostHText}" />
</StackPanel>

Это просто ужасно по многим причинам (стиль, не очень динамичный и т. Д. И т. Д.).Бар, создающий мой собственный рендер и формат строки, такой как «Пожалуйста, напишите по адресу {me@there.com|the helpdesk} для получения дополнительной помощи».Есть ли другой способ добиться этого?(Не обязательно использовать файл resources.resx)

Ответы [ 2 ]

1 голос
/ 28 января 2011

В конце я просто создал для него свой собственный элемент управления текстовым блоком (с воображаемым названием AdvancedTextBlock):

    public class AdvancedTextBlock : TextBlock {
        new private String Text { get; set; } //prevent text from being set as overrides all I do here.
        private String _FormattedText = String.Empty;
        public String FormattedText {
            get { return _FormattedText; }
            set { _FormattedText = value; AssignInlines(); }
        }
        private static Regex TagRegex = new Regex(@"\{(?<href>[^\|]+)\|?(?<text>[^}]+)?}", RegexOptions.Compiled);

        public AdvancedTextBlock() : base() { }
        public AdvancedTextBlock(System.Windows.Documents.Inline inline) : base(inline) { }

        public void AssignInlines(){
            this.Inlines.Clear();
            Collection<Hyperlink> hyperlinks = new Collection<Hyperlink>();
            Collection<String> replacements = new Collection<String>();
            MatchCollection mcHrefs = TagRegex.Matches(FormattedText);
            foreach (Match m in mcHrefs) {
                replacements.Add(m.Value);
                Hyperlink hp = new Hyperlink();
                hp.NavigateUri = new Uri(m.Groups["href"].Value);
                hp.Inlines.Add(m.Groups["text"].Success ? m.Groups["text"].Value : m.Groups["href"].Value);
                hp.RequestNavigate += new RequestNavigateEventHandler(hp_RequestNavigate);
                hyperlinks.Add(hp);
            }
            String[] sections = FormattedText.Split(replacements.ToArray(), StringSplitOptions.None);
            hyperlinks.DefaultIfEmpty(null);
            for (int i = 0, l = sections.Length; i < l; i++) {
                this.Inlines.Add(sections.ElementAt(i));
                if (hyperlinks.ElementAtOrDefault(i) != null) {
                    this.Inlines.Add(hyperlinks[i]);
                }
            }
        }

        void hp_RequestNavigate(object sender, RequestNavigateEventArgs e) {
            RequestNavigate(sender, e);
        }

        //
        // Summary:
        //     Occurs when navigation events are requested.
        public event RequestNavigateEventHandler RequestNavigate;
    }

Единственные две вещи, которые меня не устраивают в реализации:

A) Мне пришлось взломать существующее свойство Text, потому что я не знал, как запретить этому свойству переопределять то, что я делаю

B) (относится к A ) Мне нужно вызывать AssignInlines каждый раз, когда установлено поле FormattedText (которое должно быть только один раз), но это снова , вплоть до незнания, как подключиться к методу, который фактически выполняет отображение (ожидая найти событие PreRender, Render или подобное, однако я не смог), так что если кто-нибудь знает, как это сделать, это было бы здорово :).

0 голосов
/ 29 апреля 2015

Вот мое решение:

<TextBlock x:Name="MyTextBlock" Grid.Column="1" Text="{x:Static resource:ResourceFile.Message}" Style="{StaticResource MyTextStyle}" >
    <Hyperlink>
          click here
    </Hyperlink>
</TextBlock>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...