如何去除WPF中ListBox选定项周围的边框?
我有一个装满苹果的列表框。我想将所选项目更改为只有坚实的背景,没有边框。我采纳了这个建议: 这是我的xaml:如何去除WPF中ListBox选定项周围的边框?,wpf,xaml,listbox,Wpf,Xaml,Listbox,我有一个装满苹果的列表框。我想将所选项目更改为只有坚实的背景,没有边框。我采纳了这个建议: 这是我的xaml: <UserControl.Resources> <ResourceDictionary> <DataTemplate x:Key="AppleItemTemplate"> <Border Opacity="1" Padding="10,5"> <
<UserControl.Resources>
<ResourceDictionary>
<DataTemplate x:Key="AppleItemTemplate">
<Border Opacity="1" Padding="10,5">
<TextBlock Foreground="{DynamicResource PrimaryTextColor}">
<TextBlock.Text>
<Binding Path="DisplayName"/>
</TextBlock.Text>
</TextBlock>
</Border>
</DataTemplate>
<DataTemplate x:Key="AppleItemTemplateSelected">
<Border BorderThickness="0" BorderBrush="Transparent" Padding="10,5" Background="{DynamicResource LeftSidebarBGColorHighlight}">
<TextBlock Foreground="{DynamicResource PrimaryTextColor}">
<TextBlock.Text>
<Binding Path="DisplayName"/>
</TextBlock.Text>
</TextBlock>
</Border>
</DataTemplate>
<Style TargetType="{x:Type ListBoxItem}" x:Key="AppleContainerStyle">
<Setter Property="ContentTemplate" Value="{DynamicResource AppleItemTemplate}"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="ContentTemplate" Value="{DynamicResource AppleItemTemplateSelected}"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
</UserControl.Resources>
<ListBox ItemsSource="{Binding Apples}"
SelectedItem="{Binding SelectedApple}"
ItemContainerStyle="{StaticResource AppleContainerStyle}"
Background="{DynamicResource LeftSidebarBGColor}"
BorderThickness="0"
ScrollViewer.HorizontalScrollBarVisibility="Disabled" HorizontalContentAlignment="Stretch"
>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
当我运行程序并选择一个苹果时,我得到以下结果:
您可以看到XAML正在应用灰色背景色。但是有一个白色的边界不应该在那里。如果你仔细看的话,在框的左右两侧也有细微的灰色条纹,就在边框的内侧。(悲伤的脸)
有人知道我的数据模板或列表框设置有什么问题吗?如果您只想删除所选项目的边框,请尝试以下操作: 在触发器“IsSelected”中添加
在我的演示中,我发现它是有效的。MarkFeldman的答案是有效的,但存在鼠标单击事件问题。使用边框元素上的填充,当在文本项之间的填充区域中单击时,鼠标单击将不会注册。为了修复它,我用StackPanel替换了边框,并将填充移动到TextBlock上。文本块本身的填充正确地注册了单击 最终xaml:
<UserControl.Resources>
<ResourceDictionary>
<ControlTemplate x:Key="AppleItemTemplate">
<StackPanel Opacity="1">
<TextBlock Padding="10,5" Foreground="{DynamicResource PrimaryTextColor}">
<TextBlock.Text>
<Binding Path="DisplayName"/>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</ControlTemplate>
<ControlTemplate x:Key="AppleItemTemplateSelected">
<StackPanel Background="{DynamicResource LeftSidebarBGColorHighlight}">
<TextBlock Padding="10,5" Foreground="{DynamicResource PrimaryTextColor}">
<TextBlock.Text>
<Binding Path="DisplayName"/>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</ControlTemplate>
<Style TargetType="{x:Type ListBoxItem}" x:Key="AppleContainerStyle">
<Setter Property="Template" Value="{DynamicResource AppleItemTemplate}"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Template" Value="{DynamicResource AppleItemTemplateSelected}"/>
<Setter Property="BorderThickness" Value="0"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
这是可行的,但有点麻烦,因为边界元素仍然存在。所发生的情况是,ItemListBox使用了一个包含边框和ContentPresenter的模板,您正在为ContentPresenter设置要使用的数据模板,即包装器仍然存在。您需要做的是将DataTemplates更改为ControlTemplates,并设置ListBoxItem样式的“Template”属性而不是“ContentTemplate”。这是一个细微的区别,但也是一个重要的区别。以自定义按钮为例。通常,您希望能够指定整体外观,即边框厚度、突出显示颜色等,所有按钮的外观都相同。另一方面,该按钮内的内容可能是各种不同的东西……文本、图像、控件集合等,而您希望呈现内容的方式将由按钮的内容属性绑定到的数据决定。按钮的整体外观由ContentControl控制,内容由DataTemplates控制。我认为有时会出现混淆,因为人们只需要一个DataTemplate,因为他们只呈现一种类型的数据。在这种情况下,您通常可以通过覆盖ControlTemplate或DataTemplate获得完全相同的结果。但DataTemplates所做的是允许您创建一个控件,通过指定多个DataTemplates(每种类型一个),该控件可以呈现大量不同类型的数据。您可以做到这一点,而不必从头开始为每种类型重新创建整个控件。这是一件棘手的事情,因为我们在WinForms或MFC等中从未有过这种级别的控件。WPF所做的是提供更高级别的自定义,但是,如果设计不当,它会为GUI开发人员带来更多的工作。一旦您的界面开始变得更加复杂和更加数据驱动,ControlTemplate/DataTemplate范例将为您节省大量的时间和工作。@MarkFeldman那么,听起来同时使用ControlTemplate和DataTemplate是合适的,对吗?例如,如果希望使用控件模板创建公共按钮样式,但该按钮的不同实例使用不同的数据模板显示不同类型的数据。是这样吗?