Hyperlink
にForeground
の色を設定しようとしていますが、祖先のResources
にあるStyle
オブジェクトを使用しても効果はありません。私もBasedOn
のチップをChanging Hyperlink foreground without losing hover colorから使用しましたが、それは何の違いもありません - 私はまだホバーに赤い青のハイパーリンクを取得します。DataTemplate内のハイパーリンクにスタイルを伝播する方法は?
<StackPanel Background="Red" TextElement.Foreground="White">
<StackPanel.Resources>
<Style TargetType="Hyperlink" BasedOn="{StaticResource {x:Type Hyperlink}}">
<Setter Property="Foreground" Value="Yellow"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock>Data import errors</TextBlock>
<ItemsControl ItemsSource="{Binding Errors}"/>
</StackPanel>
そしてItemsControl
の項目は、次のDataTemplate
を拾っています:ここで
は、その項目のハイパーリンクを使用して示されているItemsControl
を含め、私のコントロールのXAMLです
<DataTemplate DataType="{x:Type Importer:ConversionDetailsMessage}">
<TextBlock>
<Run Text="{Binding Message, Mode=OneTime}"/>
<Hyperlink Command="Common:ImportDataCommands.ExplainConversionMessage" CommandParameter="{Binding}">
<Run Text="{Binding HelpLink.Item2, Mode=OneTime}"/>
</Hyperlink>
</TextBlock>
</DataTemplate>
にですDataTemplate
のHyperlink
に色々な色を直接設定したくないという点にも留意する価値があります。これは、によってテンプレートが使用され、異なるItemsControl
オブジェクトの数字であり、そのほとんどは白い背景にあるため、標準のハイパーリンクカラーを使用できます。ただし、上記のXAMLの背景に赤い背景があることに注意してください。
要するに、DataTemplate
は、使用されているコントロールについて何も知る必要はありません。テンプレートのコントロールのスタイルは、それをフィルタリングするだけです。
だから誰も私のスタイルをフィルタリングしない理由と私はそれを修正するために何ができるのか教えていただけますか?
ありがとうございました。
アップデート:私は私の生産アプリで動作するようにパブロの答えを得ることができなかったので、私は以来、別のテストアプリでそれを試してみた
。このアプリはWinFormsアプリケーションで、メインフォームにはElementHost
以外は何も含まれておらず、それ自体には単純なWPFユーザーコントロールが含まれています。ここではそのXAMLです:
<UserControl x:Class="DataTemplateStyling.StylingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:DataTemplateStyling="clr-namespace:DataTemplateStyling"
x:Name="root" Loaded="StylingViewLoaded">
<UserControl.Resources>
<Style x:Key="MyDefaultHyperlinkStyle" BasedOn="{StaticResource {x:Type Hyperlink}}"/>
<DataTemplate DataType="{x:Type DataTemplateStyling:ImportMessage}">
<DataTemplate.Resources>
<Style TargetType="{x:Type Hyperlink}"
BasedOn="{StaticResource MyDefaultHyperlinkStyle}"/>
</DataTemplate.Resources>
<TextBlock>
<Run Text="{Binding Message, Mode=OneTime}"/>
<Hyperlink NavigateUri="{Binding HelpLink.Item1}">
<Run Text="{Binding HelpLink.Item2, Mode=OneTime}"/>
</Hyperlink>
</TextBlock>
</DataTemplate>
</UserControl.Resources>
<Grid DataContext="{Binding ElementName=root}">
<StackPanel Background="Red" TextElement.Foreground="White">
<StackPanel.Resources>
<Style x:Key="MyDefaultHyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource {x:Type Hyperlink}}">
<Setter Property="Foreground" Value="Yellow"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock>Data import errors</TextBlock>
<ItemsControl ItemsSource="{Binding Messages}"/>
</StackPanel>
</Grid>
</UserControl>
それは述べ、これはInvalidOperationException
を生成し、上記現状では「基本型であるターゲット・タイプとスタイルにすることができる唯一の基本 『をIFrameworkInputElement』。」
これは、UserControl.Resources
要素のすぐ内側のStyle
定義にTargetType="Hyperlink"
を入れることで修正できます。メッセージが表示されているが、それらのリンク部分がまだデフォルト青いハイパーリンクのスタイルを持っているしかし、:要するに
、それは働いていないので、私は他の提案/訂正を歓迎するだろう。 :(
アップデート2:
パブロから代替ソリューションのおかげで、それは今作業です:)
すごいグーグルスキル - ありがとう!そして、非常に完全な答えです。私はこれを試してみて、それを受け入れたらそれをマークします。 –
私のアプリは 'ElementHost'を使ったWinFormsアプリなので、app.xamlファイルはありません。それでも私の 'UserControl'のリソース辞書に空の' MyDefaultHyperlinkStyle'を 'DataTemplate'の直前に追加し、上記の特定の' StackPanel'を残して独自の定義に置き換えました。残念ながら、まだ動作していません。私は物事を試していきます... –
@Mal - データテンプレート自体にスタイルを含めることを忘れませんでしたか? DataTemplate.Resources>'? –