我想将文本框文本设为超链接。假设www.google.com类型为tetxbox文本,当我点击文本时,它会显示在浏览器中打开链接..
我无法实现这个......你能不能向我提出任何想法......我尝试了两种方式。
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文本绑定到Hyperlink uri! richtextbox没有点击事件......任何建议请...
答案 0 :(得分:7)
首先,我不确定你为什么要这样做...如果文本成为可点击的超链接,那么它是一个有效的URI,你将如何继续编辑它?
Hyperlink控件不会为您做任何特殊操作,也不能在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
设置为true
。 DataTrigger
样式中的TextBox's
会选择此项并使文字带下划线和蓝色。
使超链接立即可点击会导致您无法定位光标,因此我会注意双击。收到一个后,再次将文本转换为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 ) );
}
}
}