【问题标题】:Underline Text in Label which is in a DataTemplate在 DataTemplate 中的 Label 中的文本下划线
【发布时间】:2010-12-25 14:30:14
【问题描述】:

我有一个ListView,其中包含从集合绑定的对象。我用DataTemplate 设置的对象的表示。现在我想做以下事情。 我的DataTemplate中有两个TextBlock

<DataTemplate>
   <StackPanel>
       <TextBlock Text="{Binding Name}"></TextBlock>
       <TextBlock Text="{Binding Path}"></TextBlock>
   </StackPanel>
</DataTemplate>

我已经指定了一个ItemContainerStyle,我用它来实现悬停效果。

<Style TargetType="ListViewItem" x:Key="ContainerStyle">
       <Style.Triggers>
                 <EventTrigger RoutedEvent="Mouse.MouseEnter">
  ... and so on

当用户将鼠标移到ListViewItem 上时,我的目标是强调包含名称的TextBlock。路径不应加下划线。这怎么可能实现?如何为每个ListViewItem 访问DataTemplate 中的元素?

您好, 马丁

【问题讨论】:

    标签: wpf xaml triggers styles datatemplate


    【解决方案1】:

    您可以通过为 ListViewItem 指定 ControlTemplate 或更改 DataTemplate 来执行此操作。下面的示例显示了这两种方法。请注意,当您使用 ControlTemplate 时,您会丢失所选 ListViewItem 的蓝色背景(当您将其注释掉时,它会返回) 编辑: 我没有很好地阅读您的要求。您只想在名称下划线。那么唯一的可能就是使用Datatemplate,或者重写TextBox的ControlTemplate。

    <Window x:Class="Underlining.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300"
       >
        <StackPanel>
            <ListView ItemsSource="{Binding}">
                <ListView.ItemContainerStyle>
                    <Style TargetType="ListViewItem">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ListViewItem">
                                    <Border Name="UnderlineInControlTemplate" BorderThickness="2,0,2,0"
                                            BorderBrush="Transparent">
                                        <ContentPresenter HorizontalAlignment="Left"
                                                          VerticalAlignment="Center"/>
                                    </Border>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsMouseOver" Value="True">
                                            <Setter TargetName="UnderlineInControlTemplate"
                                                    Property="BorderBrush"
                                                    Value="BlueViolet"/>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListView.ItemContainerStyle>
                <ListView.ItemTemplate>
                    <DataTemplate>
                    <StackPanel>
                        <Border Name="UnderlineInDataTemplate" BorderThickness="0,0,0,2"
                            BorderBrush="Transparent">
                             <TextBlock Text="{Binding Name}"/>
                        </Border>
                        <TextBlock Text="{Binding Path}"/>
                    </StackPanel>
                        <DataTemplate.Triggers>
                            <Trigger Property="TextBlock.IsMouseOver" Value="True">
                                <Setter TargetName="UnderlineInDataTemplate"
                                        Property="BorderBrush"
                                        Value="Red"/>
                            </Trigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackPanel>
    </Window>
    

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2011-02-07
      • 2012-10-18
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2018-01-17
      • 2012-05-30
      相关资源
      最近更新 更多