【问题标题】:Detecting if a string is a url检测字符串是否为 url
【发布时间】:2016-08-19 15:40:45
【问题描述】:

我正在从我的 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。

【问题讨论】:

  • "我知道如何在大多数语言中做到这一点,但在 WPF 中不知道" 那么你知道如何在 C# 中做到这一点吗?因为 WPF 不是语言..
  • 对不起,我了解 c# 方面(主要)但不了解 XAML,应该说清楚; IE我将能够在c#中创建一个方法,即如果它检测到一个url,则返回true,如果它不是一个url,则返回false。但我的问题是将该值应用于 XAML 以显示 url 或 norma 文本。
  • 三个(标记为重复但也有答案):stackoverflow.com/questions/16079685/…

标签: c# wpf xaml mvvm


【解决方案1】:

解决这个问题的一种方法是创建一个boolean 属性来指示URL 的有效性。 然后在 XAML 中,您可以在 GridViewColumn.CellTemplatedatatemplate 中有两个控件,一个是超链接,另一个是 TextBlock。您必须使用触发器根据布尔属性更改控件的可见性:

                <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>

【讨论】:

  • 谢谢你,正是我想要的!
  • 为什么不编辑答案并将错误的格式变成好的格式?太懒了?
【解决方案2】:

检查字符串是否为有效的url:

bool CheckUrl(string urlString)
{
  if(Uri.TryCreate(urlString, UriKind.Absolute, out uriResult))
  { 
    return (uriResult.Scheme == Uri.UriSchemeHttp);
  }
  return 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;
}

【讨论】:

    猜你喜欢
    • 2012-03-26
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多