2013-07-15 56 views
2

我想将文本框文本设置为超链接。假设如果www.google.com类型为tetxbox文本,当我点击文本时,它显示在浏览器中打开链接..如何使文本框文本为WPF中的超链接

我无法想出实现这个...你能建议我任何想法...我尝试了两种方式。

WAY1:

<TextBox Grid.Row="4" Name="txtWebPage" VerticalAlignment="Top" TextDecorations="UnderLine" TextChanged="txtWebPage_TextChanged" Foreground="Blue"> 
           </TextBox> 

way2:

<TextBlock Name="tbWebpage" Grid.Row="4" Background="White" VerticalAlignment="Top" Height="20" > 
            <Hyperlink></Hyperlink> 
           </TextBlock> 

way3:

<RichTextBox Grid.Row="4" Name="rtxtWeb" BorderBrush="Gray" BorderThickness="1" VerticalAlignment="Top" Height="20" IsDocumentEnabled="True" Foreground="Blue" LostFocus="rtxtWeb_LostFocus"> 
            <FlowDocument> 
             <Paragraph> 
              <Hyperlink NavigateUri=""/> 
             </Paragraph> 
            </FlowDocument> 
           </RichTextBox> 

我不能让我如何可以将绑定在RichTextBox的文本超链接URI! richtextbox没有点击事件...任何建议,请...

+0

如果要将文本制作为超链接,如果它是网站的URI,是的? –

+0

是的......这就是我想要的 – kida

回答

5

首先,我不知道你为什么要这样做...如果文本变成了可点击的超链接,它是一个有效的URI,你将如何继续编辑它?

超链接控件不会为您做任何特殊的事情,它不能托管在TextBox中。相反,使用常规的TextBox,在每次更新时检查文本的有效URI,并应用样式使文本看起来像可点击的链接。

<TextBox TextChanged="TextBox_TextChanged" MouseDoubleClick="TextBox_MouseDoubleClick"> 
    <TextBox.Style> 
     <Style TargetType="TextBox"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding HasValidURI}" Value="True"> 
        <Setter Property="TextDecorations" Value="Underline"/> 
        <Setter Property="Foreground" Value="#FF2A6DCD"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 

每当文本改变时,调用TextBox_TextChanged。这将使用Uri.TryCreate()检查文本是否是有效的URI。如果是这样,则将属性HasValidURI设置为trueTextBox's风格中的DataTrigger选取此选项,并使文本下划线和蓝色。

使超链接立即可点击将导致您无法定位光标,因此我只需双击即可。当收到一个人时,再次将文本转换为URI并使用该URI启动Process

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private bool _hasValidURI; 

    public bool HasValidURI 
    { 
     get { return _hasValidURI; } 
     set { _hasValidURI = value; OnPropertyChanged("HasValidURI"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string name) 
    { 
     var handler = PropertyChanged; 
     if(handler != null) handler(this, new PropertyChangedEventArgs(name)); 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     Uri uri; 
     HasValidURI = Uri.TryCreate((sender as TextBox).Text, UriKind.Absolute, out uri); 
    } 

    private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     Uri uri; 
     if(Uri.TryCreate((sender as TextBox).Text, UriKind.Absolute, out uri)) 
     { 
      Process.Start(new ProcessStartInfo(uri.AbsoluteUri)); 
     } 
    } 
} 
+0

谢谢它帮助我解决了我的问题。 – kida