Tôi đang cố gắng đặt màu Foreground
trên Hyperlink
bằng cách sử dụng đối tượng Style
trong tổ tiên của Resources
, nhưng nó không có hiệu lực. Tôi thậm chí còn sử dụng mẹo BasedOn
từ Changing Hyperlink foreground without losing hover color, nhưng nó không tạo ra bất kỳ sự khác biệt nào - tôi vẫn nhận được một siêu liên kết màu xanh dương có màu đỏ khi di chuột.Làm thế nào để truyền bá phong cách cho các siêu liên kết bên trong một DataTemplate?
Đây là XAML cho các điều khiển của tôi, trong đó có một ItemsControl
mà mục được hiển thị bằng một siêu liên kết:
<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>
Và các mục trong ItemsControl
đang nhặt sau DataTemplate
:
<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>
Đó là đáng chú ý, quá, mà tôi không muốn chỉ thiết lập các màu sắc khác nhau trực tiếp trên Hyperlink
trong DataTemplate
. Điều này là do mẫu sẽ được sử dụng bởi một số của các đối tượng khác nhau ItemsControl
, hầu hết trong số đó sẽ có nền màu trắng và do đó có thể sử dụng các màu siêu liên kết chuẩn. (Lưu ý rằng cái trong XAML ở trên, tuy nhiên, có nền màu đỏ.)
Tóm lại, tôi không muốn DataTemplate
phải biết bất kỳ điều gì về điều khiển mà nó đang được sử dụng. Các kiểu cho các điều khiển của mẫu sẽ chỉ lọc xuống.
Vì vậy, ... bất kỳ ai cũng có thể cho tôi biết tại sao kiểu không lọc xuống và tôi có thể làm gì để khắc phục?
Cảm ơn.
Cập nhật:
Vì tôi không thể có được câu trả lời Pavlo để làm việc trong ứng dụng sản xuất của tôi, tôi đã kể từ khi thử nó trong một ứng dụng thử nghiệm riêng biệt. Ứng dụng này là một ứng dụng WinForms, với biểu mẫu chính không chứa gì ngoài một số ElementHost
, bản thân nó chứa một người dùng WPF đơn giản. Dưới đây là XAML của nó: "Có thể chỉ dựa vào một phong cách với loại mục tiêu đó là kiểu cơ sở 'IFrameworkInputElement"
<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>
Khi đứng trên, điều này tạo ra một InvalidOperationException
, trong đó nêu
Điều đó có thể được sửa bằng cách đặt TargetType="Hyperlink"
trên định nghĩa Style
ngay bên trong phần tử UserControl.Resources
. Tuy nhiên, trong khi các thông điệp đang được hiển thị, phần liên kết trong số họ vẫn có phong cách siêu liên kết màu xanh mặc định:
Nói tóm lại, nó không làm việc, vì vậy tôi muốn hoan nghênh bất kỳ lời đề nghị khác/sửa chữa. :(
Cập nhật 2:
Nhờ một giải pháp thay thế từ Pavlo, nó bây giờ là làm việc :)
Kỹ năng googling tuyệt vời - cảm ơn! Và một câu trả lời rất hoàn chỉnh. Tôi sẽ thử điều này và đánh dấu nó như được chấp nhận khi tôi đã làm việc. –
Quên ứng dụng của tôi là một ứng dụng WinForms sử dụng 'ElementHost', vì vậy tôi không có tệp app.xaml. Tuy nhiên, nguyên tắc có vẻ như âm thanh, vì vậy tôi đã thử thêm 'MyDefaultHyperlinkStyle' trống trước' DataTemplate' trong từ điển tài nguyên 'UserControl' của tôi và để lại' StackPanel' cụ thể được thấy ở trên để thay thế nó bằng định nghĩa riêng của nó. Đáng buồn thay, nó vẫn không hoạt động. Tôi sẽ tiếp tục cố gắng điều ... –
@Mal - Không phải anh quên bao gồm phong cách trong các mẫu dữ liệu riêng của mình: ' '? –