对于一个项目,我已经实现了一个小的智能感知像控制这只不过是一个ListBox
。 它的DataTemplate
包含一个的StackPanel
保持一个Image
和一个TextBlock
。 没有其他的。 正如你可以在我的控制的第一个截图中看到,该列表框选择框中选择整个项目(通常正好是一个可以预料到的):
不过我“偷”从VS11图标是低质量的,所以我想如Visual Studio确实调整的选择:
你可以看到,只有选中文本(可视化表示不会忽略图像/图标),我想知道我怎样才能实现这一行为,太。
编辑:图标只是GIF文件具有透明背景。 我将与更好的取代他们,但尽管如此,我在如何获得所需的行为利益。220。
以下是通过更换一个ListBoxItem控件模板的解决方案。 在我的测试中,我只显示两个文本字符串,与第二个突出。
<Page.Resources>
<Style x:Key="ItemStyle" TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="Selected" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ListBoxItem}}}" Value="True">
<Setter Property="Background"
Value="{x:Static SystemColors.HighlightBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
<DataTemplate x:Key="ItemTemplate" DataType="{x:Type ViewModel:DataItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" SharedSizeGroup="c1"/>
<ColumnDefinition Width="auto" SharedSizeGroup="c2"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Source="../Images/Collapse.png"/>
<TextBlock Grid.Column="1" Text="{Binding Name}" Margin="0,0,5,0"/>
<TextBlock Style="{StaticResource Selected}"
Grid.Column="2" Text="{Binding Description}"/>
</Grid>
</DataTemplate>
</Page.Resources>
<Page.DataContext>
<Samples:Page3ViewModel/>
</Page.DataContext>
<Grid>
<ListBox
Grid.IsSharedSizeScope="True"
SelectedIndex="2"
HorizontalContentAlignment="Stretch"
ItemsSource="{Binding Items}"
ItemContainerStyle="{StaticResource ItemStyle}"
ItemTemplate="{StaticResource ItemTemplate}"/>
</Grid>
视图模型包含了简单的数据项的集合
public class Page3ViewModel
{
public Page3ViewModel()
{
Items = new List<DataItem>
{
new DataItem{Name = "One", Description = "First"},
new DataItem{Name = "Two", Description = "Second"},
new DataItem{Name = "Three", Description = "Third"},
new DataItem{Name = "Four", Description = "Fourth"},
};
}
public IEnumerable<DataItem> Items { get; private set; }
}
给予
你的问题是由于方式呈现WPF ListBox中的每个项目。 它使用它包装在ListBoxItem中每个项目的ItemContainerStyle。 正是这种ListBoxItem中包含要显示(在你的情况,其中包含一个图像和一个TextBlock一个StackPanel)的内容。
默认情况下,ListBoxItem中显示围绕它显示的所有内容蓝色矩形。
我想出了一个解决方案,但它是一个黑客。 只是让你的形象更大,有背景的像素颜色匹配列表框的背景颜色(在我的情况下,白色),并使用下面的XAML。
<ListBox Margin="5"
ItemsSource="{Binding Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal"
Margin="-2,0,0,0">
<Image Source="Save-icon.png" />
<TextBlock Margin="5,8,0,0"
Text="{Binding}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这是结果:
更新
我想出了一个修改,这使得黑客攻击的少这一点。 在我的ItemTemplate我有一个边界 ,采用结合来获得它的背景颜色从它的父列表框围绕的图像。 (图像不再周围有边框)。
更新XAML这样:
<ListBox Margin="5"
ItemsSource="{Binding Items}"
Background="LightSteelBlue">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal"
Margin="-2,0,0,0">
<Border Background="{Binding Path=Background, RelativeSource={RelativeSource AncestorType=ListBox}}"
Padding="10">
<Image Source="Save-icon.png"/>
</Border>
<TextBlock Margin="5,8,0,0"
Text="{Binding}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这是新的结果:
现在,所有你需要做的是更新列表框的背景颜色,一切都将自动进行调整。 例如
<ListBox Margin="20"
ItemsSource="{Binding Items}"
Background="PeachPuff">