2013-07-15 1 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 : 나는 URI 하이퍼 링크하기를 RichTextBox 텍스트를 결합하는 방법을 얻을 couldnt한다

<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에 대한 클릭 이벤트가 없습니다 ... 제안 사항이 있으시면 ...

+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 속성은 true으로 설정됩니다. DataTriggerTextBox'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)); 
     } 
    } 
} 
+0

덕분에 내 문제를 해결할 수있었습니다. – kida