2011-11-03 5 views
1

RichTextBox에 코드 숨김 또는 Xaml을 통해 바인딩 된 가능성이있는 경우 텍스트 + 하이퍼 링크를 표시하려고합니다.RichTextBox의 동적 사용자 지정 콘텐츠

당분간은 TextBlock에 바인드 된 Url이있는 문자열 변수가 있습니다 (클릭 가능하게 만드는 것이 좋습니다).

<TextBlock Text="{Binding myTextWithUrl}" /> 

을 (A richTB에서 :)에 의해 : 내가 ItemsControl에 사용자 정의 개체

와 템플릿 한

다음
<Run Text="partOfTextNonUrl" /><Hyperlink NavigateUri="theUrl" TargetName="whatever" /> 

그것이 표시되는 방법이다 나는 기본적으로 교체하고 싶습니다

<ItemsControl ItemsSource="{Binding FeedResults}"> 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
    <StackPanel Orientation="Vertical" > 
    <my:SearchResultItem /> 
    </StackPanel> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 
</ItemsControl> 

그리고이 사용자 지정 컨트롤은 위에서 제시 한대로 3 개의 TextBlocks에 바인딩 된 데이터를 제공합니다. title, date 텍스트 + URL이 포함 된 텍스트

나는 문자열에서 URL을 추출하는 메서드를 이미 가지고 있는데, 사용 방법을 모르겠습니다. 동적으로 Run() 및 Hyperlink()를 생성하여 단락에 추가 할 수 있지만 바인딩하는 방법은 무엇입니까?

또는 다른 해결책이 있습니까? 너는 내 하루를 만들거야 !!

감사합니다, 실뱅

답변

0

확인을 클릭합니다. 따라서 Silverlight에서는 인라인 하이퍼 링크가 허용되지 않습니다. 그러나 당신은 당신 자신을 만들 수 있습니다!

http://csharperimage.jeremylikness.com/2009/11/inline-hyperlinks-in-silverlight-3.html

쉽게되지 않음 - 적어도 쉬운 일이 아닙니다 그것이 있어야로. 그러나 그것은 일을 끝내야한다.

이러한 실행에 하이퍼 링크를 추가 할 수있게되면 접근 방법은 다음과 같습니다. 단일 TextBlock (txtContent)을 사용하여 사용자 정의 컨트롤을 만듭니다. DataContext="{Binding myTextWithUrl}"을 설정하십시오. 그런 다음 코드 뒤에 :

public TextWithUrlUserControl() 
{ 
    InitializeComponent(); 

    this.Loaded += (s, e) => 
         { 
          foreach(var inline in ParseText(DataContext as string)) 
           txtContent.Inlines.Add(inline); 
         }; 
} 

IEnumerable<Inline> ParseText(string text) 
{ 
    // return list of Runs and Runs with hyperlinks using your URL parsing 
    // for demo purposes, just hardcoding it here: 
    return new List<Inline> 
       { 
        new Run{Text="This text has a "}, 
        new Run{Text="URL", RunExtender.NavigateUrl="http://www.google.com/"}, 
        new Run{Text="in it!"} 
       };  
} 

희망이 도움이 되길 바랍니다.

+0

안녕하세요 아담, 실제로 작동하지만 아담스 실즈 포스트 (http://blogs.catapultsystems.com/asills)님께 감사드립니다. /archive/2010/11/17/fun-with-attached-properties-%E2%80%93-bindable-richtextbox-xaml.aspx) Xaml 속성을 바인딩 할 수있었습니다. 여기에 제가 한 일이 있습니다 : http : //mysharpsnippets.wordpress.co.kr/2011/11/06/dynamic-content-in-richtextbox/ 다시 도움 주셔서 감사합니다;) – Slyvain

0

나는 이런 식으로 할 것입니다. 텍스트를 가져올 ValueConverter를 만듭니다 (URL 포함). 그런 다음 TextBlock에서 Run 및 Hyperlink를 만듭니다. 둘 다 텍스트에 바인딩합니다. 둘 다 ValueConverter를 사용하지만 ValueConverter와는 다른 매개 변수를 사용합니다.

ValueConverter :

public class MyCustomValueConverter: IValueConverter 
{  
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if(parameter.ToString()== "URL") 
     { 
      // return the URL part of the string 
     } 
     else 
     { 
      // return the non-URL portion of the string 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

이 그런 다음 XAML은 다음과 같습니다

<Run Text="{Binding myTextWithUrl, Converter={StaticResource valueConverter}}"></Run><Hyperlink NavigateUri="{Binding myTextWithUrl, Converter={StaticResource valueConverter}, ConverterParameter=URL}"></Hyperlink> 
+0

고맙습니다. 텍스트 + 하이퍼 링크가있는 것을 알았다면 고맙겠습니다. 트릭은 URL에 여러 글자가 있는지 모르겠다는 것입니다. 예를 들어 아무 것도 없거나 3을 가질 수 있습니다. 그래서 어떻게 든 실행과 하이퍼 링크를 동적으로 생성해야합니다. – Slyvain

+0

아. 알았다. 곧 내가 접근 할 방법을 나타내는 또 다른 답변을 추가하겠습니다 ... –

관련 문제