WPF - Создание активируемых по щелчку гиперссылок

Вы можете использовать оператор PIVOT.

Sum of transactions per DATE Вы хотите сказать, что хотели получить COUNT количества транзакций в день? Если это так, измените SUM (T_NUMBER) на COUNT (T_NUMBER)

SELECT *
FROM   (
           SELECT [STORE_ID], [DAY] = DATEPART (DAY , [DATETIME])
           FROM   store_logs
       ) AS D
       PIVOT
       (
           SUM (T_NUMBER)
           FOR DAY IN ([1], [2], [3], [4], [5], ... [31])
       ) AS P
27
задан 14 May 2009 в 03:23
поделиться

3 ответа

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

Для синтаксического анализа вы можете искать URL-адреса в тексте с помощью регулярного выражения. Я позаимствовал регулярное выражение из Хорошее регулярное выражение URL? , но есть и другие, доступные в Интернете, так что вы можете выбрать то, которое вам больше всего подходит.

В приведенном ниже примере я использовал прикрепленное свойство. Чтобы использовать его, измените свой TextBlock, чтобы использовать NavigateService.Text вместо свойства Text:

<Window x:Class="DynamicNavigation.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:DynamicNavigation"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <!-- Type something here to see it displayed in the TextBlock below -->
        <TextBox x:Name="url"/>

        <!-- Dynamically updates to display the text typed in the TextBox -->
        <TextBlock local:NavigationService.Text="{Binding Text, ElementName=url}" />
    </StackPanel>
</Window>

Код для присоединенного свойства приведен ниже:

using System;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace DynamicNavigation
{
    public static class NavigationService
    {
        // Copied from http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx
        private static readonly Regex RE_URL = new Regex(@"(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~/|/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?");

        public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached(
            "Text",
            typeof(string),
            typeof(NavigationService),
            new PropertyMetadata(null, OnTextChanged)
        );

        public static string GetText(DependencyObject d)
        { return d.GetValue(TextProperty) as string; }

        public static void SetText(DependencyObject d, string value)
        { d.SetValue(TextProperty, value); }

        private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var text_block = d as TextBlock;
            if (text_block == null)
                return;

            text_block.Inlines.Clear();

            var new_text = (string)e.NewValue;
            if ( string.IsNullOrEmpty(new_text) )
                return;

            // Find all URLs using a regular expression
            int last_pos = 0;
            foreach (Match match in RE_URL.Matches(new_text))
            {
                // Copy raw string from the last position up to the match
                if (match.Index != last_pos)
                {
                    var raw_text = new_text.Substring(last_pos, match.Index - last_pos);
                    text_block.Inlines.Add(new Run(raw_text));
                }

                // Create a hyperlink for the match
                var link = new Hyperlink(new Run(match.Value))
                {
                    NavigateUri = new Uri(match.Value)
                };
                link.Click += OnUrlClick;

                text_block.Inlines.Add(link);

                // Update the last matched position
                last_pos = match.Index + match.Length;
            }

            // Finally, copy the remainder of the string
            if (last_pos < new_text.Length)
                text_block.Inlines.Add(new Run(new_text.Substring(last_pos)));
        }

        private static void OnUrlClick(object sender, RoutedEventArgs e)
        {
            var link = (Hyperlink)sender;
            // Do something with link.NavigateUri like:
            Process.Start(link.NavigateUri.ToString());
        }
    }
}
44
ответ дан 28 November 2019 в 04:44
поделиться

Вот упрощенная версия:

<TextBlock>
    Hey, check out this link:        
    <Hyperlink NavigateUri="CNN.COM" Click="cnn_Click">Test</Hyperlink>
</TextBlock>
11
ответ дан 28 November 2019 в 04:44
поделиться

Что-то вроде этого?

<TextBlock>
    <TextBlock Text="Hey, check out this link:"/>
    <Hyperlink NavigateUri={Binding ElementName=lvTopics, Path=SelectedValue.Title}
                           Click="Url_Click">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Feed: " FontWeight="Bold"/>
            <TextBlock Text={Binding ElementName=lvTopics, Path=SelectedValue.Url}/>
        </StackPanel>
    </Hyperlink>
</TextBlock>

РЕДАКТИРОВАТЬ: Если вам нужен динамический, привяжите его. В приведенном выше примере lvTopics (не показан) привязан к списку объектов со свойствами Title и Url. Кроме того, он не перейдет к URL-адресу автоматически, вам нужно обработать его с помощью аналогичного кода:

private void Url_Click(object sender, RoutedEventArgs e)
{    browser.Navigate(((Hyperlink)sender).NavigateUri); }

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

4
ответ дан 28 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: