質問

人の名前、電子メール、部門などのリストを表示する ListBox があります。各プロパティを表示するためのいくつかの TextBlock を含む DataTemplate があります。これらの TextBlock の 1 つは、次のように電子メール アドレスを表示するハイパーリンクをラップしています。

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

これは正常に機能しますが、その人が電子メール アドレスを持っていない場合、TextBlock は自動的に折りたたまれません。そこで、値コンバータを作成し、次のようなスタイルで使用しました(簡略化しました)。

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 に追加しました。

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

この変更後、電子メール アドレスは表示されなくなります。値コンバーターでは、TextBlock のテキストは常に空になり、Visibility.Collapsed が返されます。ハイパーリンクが読み込まれる前に TextBlock のテキストを評価しているようなものです...

これを理解するのを手伝ってください。

ありがとう!

役に立ちましたか?

解決

作成したコンバーターは、 TextBlock Text を、内部の Hyperlink のテキストではなく、空と比較しています。本当に RelativeSource を子 Hyperlink に設定したいと思いますが、それは不可能だと思います。

縮小しないのは TextBlock のサイズですか?代わりに Hyperlink (またはその内部の TextBlock )にスタイルを配置した場合、それでも動作するでしょうか?

編集: Hyperlink には Visibility プロパティがありません。そのため、スタイルをそれに変更しても、残念ながら役に立ちません。私が考えることができる他の唯一のオプションは、 TextBlock から派生するカスタムコントロールを作成することです。これには、 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 の HyperlinkBut​​ton ではなく、Content プロパティを持っていません。恥ずかしいですね。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top