2016-08-19 2 views
-1

Я распечатываю URL-адрес из набора данных в моем файле xaml. Проблема в том, что мне требуется создать гиперссылку, если строка является допустимым URL.Обнаружение, если строка является URL-адресом

Я знаю, как это сделать на большинстве языков, но не в WPF. Я ищу что-то, что работает;

if(isurl) 
    display hyperline gridrow 
else 
    display string gridrow 

Мой xaml в настоящее время;

<u:GridViewColumnEx x:Uid="column_4" Width="225" > 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock> 
       <Hyperlink> 
        <TextBlock Text="{Binding Data.path}"/> 
       </Hyperlink> 
      </TextBlock> 
     </DataTemplate> 
    </GridViewColumn.CellTemplate> 
</u:GridViewColumnEx> 

Но это отображает все в столбце как гиперссылку (очевидно). Я читал о триггерах, но не уверен, что это то, что мне нужно. Я довольно много читал о триггерах, но не уверен, как изменить xaml на основе возвращаемого значения.

+4

«Я знаю, как это сделать на большинстве языков, но не в WPF_». Знаете ли вы, как это сделать на C#? Поскольку WPF не является языком .. –

+0

Извините, я понимаю, что сторона C# (в основном), но не XAML, должна была сделать это понятным; I.E, я смогу создать метод в C#, чтобы вернуть true, если он обнаруживает URL-адрес или false, если это не URL-адрес. Но моя проблема будет применять эту ценность для XAML, чтобы отображать текст url или norma. – Dannys19

+3

One: http://stackoverflow.com/questions/7578857/how-to-check-whether-a-string-is-a-valid-http-url –

ответ

1

Одним из способов решения этой проблемы является создание свойства boolean, указывающего срок действия URL-адреса. Затем в XAML у вас может быть два элемента управления в datatemplate вашего GridViewColumn.CellTemplate один из гиперссылок и другого текстового блока. Вы должны изменить видимость элементов управления на основе булева свойства с помощью триггеров:

   <DataTemplate> 
       <Grid> 
        <TextBlock Visibility="Collapsed" Name="Hyperlink"> 
      <Hyperlink NavigateUri="{Binding Data.path}"> 
      </Hyperlink> 
        </TextBlock> 
      <TextBlock Visibility="Collapsed" Name="simpleText" 
         Text="{Binding Data.path}"></TextBlock> 
       </Grid> 
       <DataTemplate.Triggers> 
        <DataTrigger Binding="{Binding Data.IsValidURL}" //your boolean property 
           Value="True"> 
      <Setter TargetName="Hyperlink" 
           Property="Vibility" 
           Value="Visible" /> 
        </DataTrigger> 
      <DataTrigger Binding="{Binding Data.IsValidURL}" //your boolean property 
           Value="False"> 
      <Setter TargetName="simpleText" 
        Property="Vibility" 
        Value="Visible" /> 
      </DataTrigger> 
      <DataTemplate.Triggers> 
      </DataTemplate> 
+0

извините за плохое форматирование. – Sameed

+0

Спасибо за это, именно то, что я искал! – Dannys19

+0

Почему бы не отредактировать ответ и не превратить плохое форматирование в хорошее форматирование? Слишком ленив? – Clemens

1

Чтобы проверить, если строка является допустимой URL:

bool CheckUrl(string urlString) 
{ 
    if(Uri.TryCreate(urlString, UriKind.Absolute, out uriResult)) 
    { 
    return (uriResult.Scheme == Uri.UriSchemeHttp); 
    } 
    return false; 
} 

Чтобы сделать текст гиперссылки на основе верно или false удалить элемент гиперссылки из Xaml. Вы создадите гиперссылку программно на основе URL-адреса.

if(CheckUrl(urlString)) 
{ 
    TextBlock.Inlines.Add(new Hyperlink (new Run("Click me")){NavigateUri = new Uri("urlString",UriKind.Absolute) }); 
} 
else 
{ 
    TextBlock.Text = urlString; 
} 
Смежные вопросы