【问题标题】:Removing ListBoxItem background for right click events删除右键单击事件的 ListBoxItem 背景
【发布时间】:2017-03-16 23:20:00
【问题描述】:

我已经设法防止 ListBox 项目背景在悬停和选择时显示,但是,当我右键单击项目时它会出现,然后当 ListBox 再次获得焦点时甚至显示悬停时的背景(对于之前被右键单击的元素)。

我不能在ListBoxPreviewMouseDown 中使用e.Handled = true,因为这会破坏我的右键单击上下文菜单。通过中断,我的意思是它可以防止菜单项对点击做出反应。上下文菜单显示正常,但无法调用项目点击。

我还缺少什么来覆盖ListBoxItem 在右键单击时不显示的背景?

谢谢。

<!-- Style -->
<Style TargetType="ListBoxItem" x:Key="MyListBoxItemStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border x:Name="Bd"
                Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"
                Padding="{TemplateBinding Padding}"
                SnapsToDevicePixels="True">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                Content="{TemplateBinding Content}"
                                ContentStringFormat="{TemplateBinding ContentStringFormat}"
                                ContentTemplate="{TemplateBinding ContentTemplate}"
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </Border>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Bd" Property="Background" Value="Transparent" />
                        <Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" />

                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive" Value="False" />
                            <Condition Property="IsSelected" Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Bd" Property="Background" Value="Transparent" />
                        <Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" />
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive" Value="True" />
                            <Condition Property="IsSelected" Value="True" />
                        </MultiTrigger.Conditions>
                        <Setter TargetName="Bd" Property="Background" Value="Transparent" />
                        <Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" />
                    </MultiTrigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="Bd" Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- Listbox -->

<ListBox Name="ListBoxOne">
        <ListBox.Style>
            <Style>
                <Style.Triggers>
                    <Trigger Property="ListBox.IsMouseOver" Value="True">
                        <Setter 
                            Property="ListBox.ItemContainerStyle" 
                            Value="{StaticResource MyListBoxItemStyle}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.Style>
    </userControls:ListBox>

【问题讨论】:

  • 为什么不使用ItemsControl

标签: c# wpf xaml listbox listboxitem


【解决方案1】:

始终将ListBoxItemContainerStyle 属性设置为您的自定义样式,即不要在Style 内的触发器中设置它:

<ListBox Name="ListBoxOne">
    <ListBox.Style>
        <Style TargetType="ListBox">
            <Setter Property="ItemContainerStyle" Value="{StaticResource MyListBoxItemStyle}"/>
        </Style>
    </ListBox.Style>
</ListBox>

【讨论】:

  • 这完全解决了问题。这当然是一个只见树木不见森林的例子。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-06-28
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2011-01-25
相关资源
最近更新 更多