2012-02-18 26 views
4

我做了一个风格,使得TextBlock看起来像一个链接:条件样式在WPF

<Style x:Key="linkStyle" TargetType="TextBlock"> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="TextDecorations" Value="Underline" /> 
     </Trigger> 
    </Style.Triggers> 
    <Setter Property="Cursor" Value="Hand" /> 
    <Setter Property="Foreground" Value="Blue" /> 
    <EventSetter Event="MouseLeftButtonDown" Handler="navigateLink" /> 
</Style> 

如何应用它,只有当TextBlock.Text开始与的http://

+1

您可以使用StyleSelector。看到这篇文章http://stackoverflow.com/questions/5082509/wpf-use-a-styleselector-for-a-button – Phil 2012-02-18 12:11:36

+1

也许你必须使用事件和自定义的C#代码来做到这一点;默认情况下,XAML不够智能以模仿String.StartsWith或基于正则表达式应用样式。当然,您也可以创建自定义控件,继承TextBlock并具有像DoesTextStartWithHttp这样的属性,因此您可以在XAML中使用此属性,但对于我来说,使用事件处理程序更改C#代码中的样式更容易。 – Vitaliy 2012-02-18 13:08:27

+0

可以使用自定义的C#代码(它已经有一些'navigateLink'函数),但是我希望能够将结果样式应用到简单的'TextBlock' – Poma 2012-02-18 14:07:51

回答

12

试试这个

<Style x:Key="linkStyleConditional" TargetType="{x:Type TextBlock}"> 
    <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/> 
       <Condition Binding="{Binding Path=Text, Converter={StaticResource SomeConverter}}" Value="True"/> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="Foreground" Value="Orange" /> 
     </MultiDataTrigger> 
    </Style.Triggers> 
</Style> 

在SomeConverter写逻辑如果文本以http //开始:然后返回true,否则返回假。我希望这将有所帮助。