Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何去除WPF中ListBox选定项周围的边框?_Wpf_Xaml_Listbox - Fatal编程技术网

如何去除WPF中ListBox选定项周围的边框?

如何去除WPF中ListBox选定项周围的边框?,wpf,xaml,listbox,Wpf,Xaml,Listbox,我有一个装满苹果的列表框。我想将所选项目更改为只有坚实的背景,没有边框。我采纳了这个建议: 这是我的xaml: <UserControl.Resources> <ResourceDictionary> <DataTemplate x:Key="AppleItemTemplate"> <Border Opacity="1" Padding="10,5"> <

我有一个装满苹果的列表框。我想将所选项目更改为只有坚实的背景,没有边框。我采纳了这个建议:

这是我的xaml:

<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是合适的,对吗?例如,如果希望使用控件模板创建公共按钮样式,但该按钮的不同实例使用不同的数据模板显示不同类型的数据。是这样吗?