Home > OS >  How do you get ListBoxItem.IsMouseCaptured to trigger style changes?
How do you get ListBoxItem.IsMouseCaptured to trigger style changes?

Time:12-16

I'm using the following style:

<Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Foreground" Value="{DynamicResource Button-Foreground}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <TextBlock Padding="10"
                            Background="{TemplateBinding Background}"
                            Foreground="{TemplateBinding Foreground}">
                    <ContentPresenter/>
                </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="{DynamicResource Button-Foreground-Disabled}"/>
        </Trigger>
        <Trigger Property="IsMouseCaptured" Value="True">
            <Setter Property="Background" Value="{DynamicResource Button-Background-Hover}"/>
            <Setter Property="Foreground" Value="{DynamicResource Button-Foreground}"/>
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsMouseOver" Value="True"/>
                <Condition Property="IsMouseCaptured" Value="False"/>
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="{DynamicResource Button-Background-Hover}"/>
            <Setter Property="Foreground" Value="{DynamicResource Button-Foreground-Hover}"/>
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="True"/>
                <Condition Property="IsMouseOver" Value="False"/>
            </MultiTrigger.Conditions>
            <Setter Property="Background" Value="{DynamicResource Button-Foreground}"/>
            <Setter Property="Foreground" Value="{DynamicResource Button-Foreground-Hover}"/>
        </MultiTrigger>
    </Style.Triggers>
</Style>

The issue I'm having is that the IsMouseCaptured trigger never occurs. It keeps the IsMouseOver style even when I clicked it (the background is the same color intentionally, but I've tried changing just to experiment and it doesn't change at all and the foreground certainly doesn't change).

Is there a way to have triggers occur for a specific list box item when it is clicked? All the other triggers are working as expected.

CodePudding user response:

Is there a way to have triggers occur for a specific list box item when it is clicked?

Not using any built-in property.

You could create your own custom ListBoxItem that adds an IsPressed property that you can bind to:

public class CustomListBoxItem  : ListBoxItem
{
    public static readonly DependencyProperty IsPressedProperty = DependencyProperty.Register(
        nameof(IsPressed), typeof(bool), typeof(CustomListBoxItem), new PropertyMetadata(false));

    public bool IsPressed
    {
        get => (bool)GetValue(IsPressedProperty);
        set => SetValue(IsPressedProperty, value);

    }
    protected override void onm ouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);
        IsPressed = true;
    }

    protected override void onm ouseUp(MouseButtonEventArgs e)
    {
        base.OnMouseUp(e);
        IsPressed = false;
    }
}

Unless you create the ListBoxItem elements explicitly, you will also need a custom ListBox that generates containers of your custom type:

public class CustomListBox : ListBox
{
    protected override DependencyObject GetContainerForItemOverride() =>
        new CustomListBoxItem();
}
  • Related