문제

사람들의 이름, 이메일, 부서 등의 목록을 보여주는 ListBox가 있습니다. 각 속성을 표시 할 텍스트 블록이 몇 개있는 DataTemplate이 있습니다. 이 텍스트 블록 중 하나는 하이퍼 링크를 래핑하여 다음과 같은 이메일 주소를 표시하는 것입니다.

<TextBlock>
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</TextBlock>

이것은 잘 작동하지만 사람에게 이메일 주소가 없으면 텍스트 블록이 자동으로 무너지지 않습니다. 그래서 나는 값 변환기를 썼고 so (simplified)와 같은 스타일로 사용됩니다.

string s = (String) value;
if (s == ""){
   return Visibility.Collapsed;
}
return Visibility.Visible;

그리고 이것은 ValueConverter를 사용하는 스타일입니다.

<Style x:Key="ResultItemTextBoxStyle">
    <Setter Property="TextBlock.Visibility" Value="{Binding Path=Text, RelativeSource={RelativeSource Self}, 
                                                    Converter={StaticResource StringToVisibilityConverter}}"/>
</Style>

그리고 컨버터를 텍스트 블록에 호출하는 스타일을 추가했습니다.

<TextBlock Style="{StaticResource ResultItemTextBoxStyle}">
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</TextBlock>

이 변경 후 전자 메일 주소가 표시되지 않습니다. 값 변환기에서 텍스트 블록의 텍스트는 항상 비어 있고 가시성을 반환합니다. 하이퍼 링크가로드되기 전에 텍스트 블록의 텍스트를 평가하는 것과 같습니다.

이것을 알아 내도록 도와주세요.

감사!

도움이 되었습니까?

해결책

당신이 쓴 변환기는 TextTextBlock 내부의 텍스트가 아니라 비어 있습니다 Hyperlink. 나는 당신이 정말로 설정하고 싶다고 생각합니다 RelativeSource 아이에게 Hyperlink, 그러나 나는 그것이 가능하다고 생각하지 않습니다.

당신은 그것이 확실합니까 TextBlock무너지지 않는 크기? 당신이 스타일을 올려 놓으면 Hyperlink 대신 (또는 심지어 내부 TextBlock), 아마도 여전히 작동할까요?

편집하다: Hyperlink A가 없습니다 Visibility 속성이므로 스타일을 옮기는 것은 불행히도 도움이되지 않습니다. 내가 생각할 수있는 유일한 옵션은 TextBlock, 그리고 그것은 a를 포함합니다 Hyperlink 그리고 TextBlock. 당신이 추가하는 경우 Email DependencyProperty 그것에 대해, 당신은 그것을 사용하여 컨트롤이 표시되어야하는지 여부를 결정하고 Hyperlink 그리고 그것의 내부 TextBlock.

이것을 처리하는 더 좋은 방법이 있어야하지만 현재는 아무것도 생각할 수 없습니다.

다른 팁

나는 다음과 같은 일을 할 것입니다.

<TextBlock>
   <TextBlock.Style>
      <Style>
         <Setter Property="Visibility" Value="Visible"/>
         <Style.Triggers>
            <DataTrigger Binding="{Binding Email}" Value="">
               <Setter Property="Visibility" Value="Collapsed"/>
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </TextBlock.Style>
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</TextBlock>

값 변환기를 작성하는 것은 과잉이라고 생각합니다 (범죄는 의도하지 않음).

나는 이것이 당신의 질문이 아니라는 것을 알고 있지만 왜 텍스트 블록을 전혀 사용합니까?

간단히 사용합니다

    <Hyperlink NavigateUri="{Binding Email}" Content="{Binding Email}" 
Visibility="{Binding Email, Converter={StaticResource StringToVisibilityConverter}}" />

내가 착각하지 않는 한 당신이 원하는 것을해야합니다.

업데이트 : OK, 실수합니다. WPF 하이퍼 링크는 Silverlight의 HyperLinkButton이 아니며 컨텐츠 속성이 없습니다. 나를 부끄러워.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top