WPF- 텍스트 블록에서 하이퍼 링크 용 DataTemplate/값 변환기
-
03-07-2019 - |
문제
사람들의 이름, 이메일, 부서 등의 목록을 보여주는 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>
이 변경 후 전자 메일 주소가 표시되지 않습니다. 값 변환기에서 텍스트 블록의 텍스트는 항상 비어 있고 가시성을 반환합니다. 하이퍼 링크가로드되기 전에 텍스트 블록의 텍스트를 평가하는 것과 같습니다.
이것을 알아 내도록 도와주세요.
감사!
해결책
당신이 쓴 변환기는 Text
의 TextBlock
내부의 텍스트가 아니라 비어 있습니다 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이 아니며 컨텐츠 속성이 없습니다. 나를 부끄러워.