1

ListBoxItemには次のスタイルが定義されています。

    <Style x:Key="detailListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="AutomationProperties.AutomationId" Value="{Binding Path=StringTableKey}"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="Padding" Value="2,0,0,0"/>
    <Setter Property="FocusVisualStyle" Value="{x:Null}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border x:Name="Bd" Margin="4" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource MenuItemSelectedBackgroundBrush}"/>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsSelected" Value="false">
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource MenuItemUnSelectedBackgroundBrush}"/>
                    </Trigger>
                    <!-- This is the case when a detail is selected (the master list loses focus). -->
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <!--<Setter Property="Opacity" TargetName="Bd" Value=".4"/>-->
                    </MultiTrigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

このスタイルが適用されるリストボックスは、次のように定義されます。

<ListBox 
    x:Name="listBox"
    Margin="0,60,0,0"
    MaxHeight="600"
    Foreground="Transparent"
    Style="{StaticResource detailListBoxStyle}" 
    ItemContainerStyle="{StaticResource detailListBoxItemStyle}" 
    ItemsSource="{Binding Source={StaticResource detailCollectionViewSource}}" 
    ItemTemplateSelector="{StaticResource detailDataTemplateSelector}"
    TouchDown="ListBoxTouchDown"
    TouchMove="ListBoxTouchMove"
    TouchUp="ListBoxTouchUp"
    KeyDown="ListBoxKeyDown">
    <ListBox.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Margin="0,10,0,0" FontWeight="Bold" FontSize="20" Foreground="White" Text="{Binding Path=Name}"/>
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ListBox.GroupStyle>
</ListBox>

ListBoxItemのDataTemplateがあります。これは次のようになります。

<DataTemplate x:Key="detailOnOffTemplate">
    <Grid Height="50" Width="{StaticResource detailWidth}">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock x:Name="tb1" Margin="4,2,0,0" Grid.Row="0" Style="{StaticResource MenuTextStyle}" Text="{Binding DisplayName}" VerticalAlignment="Top" TextAlignment="Left">
         <TextBlock.Effect>
            <DropShadowEffect Color="White" ShadowDepth="0" BlurRadius="7"/>
        </TextBlock.Effect>
        </TextBlock>
    </Grid>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True">
            <Setter TargetName="tb1" Property="Foreground" Value="White"/>
            <Setter TargetName="tb1" Property="Effect" Value="{x:Null}"/>
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

DataTemplate内から「Selector.IsSelectionActive」にバインドできる必要がありますが、何も機能しません。私はこれらのことを試しました:

            <DataTrigger Binding="{Binding Selector.IsSelectionActive, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True">

            <Trigger Binding="{Binding Selector.IsSelectionActive, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True">

            <Trigger "Selector.IsSelectionActive" Value="True">

基本的に、DataTemplateのControlTemplateに含まれているものと同じトリガーが必要です。

                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="Selector.IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <!--<Setter Property="Opacity" TargetName="Bd" Value=".4"/>-->
                    </MultiTrigger>

または、他にどのようにして「IsSelected」という項目を知ることができますが、キーボードフォーカスがありませんか?

4

2 に答える 2

7

最初に試したオプションは、それが添付プロパティであることを識別していない正しい例外であるため、IsSelectionActiveというプロパティ名を持つオブジェクトを返すSelectorという名前のプロパティにバインドしようとしているように見えます。したがって、次のようなものが機能すると思います。

<DataTrigger Binding="{Binding Path=(Selector.IsSelectionActive), RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" Value="True">
于 2012-09-26T21:34:31.433 に答える
0

前の答えは私にはうまくいきませんでしたが、何時間もプレイした後、これはうまくいきました:

ここで重要なのは(私が思うに)IsSelectionActiveFALSEが最初に来るということでした。また、そのトリガーは、IsSelectedと組み合わせたマルチトリガーでもあります。この場合、角かっこを使用する必要はありませんでした。ただし、これは、最新の.netフレームワークであるWpfとVisual Studioを使用しているためである可能性があるため、前の回答で説明した角かっこが必要になる場合があります。

赤、黄、白はこのサンプル用です。これらの色を変更することを忘れないでください。

<ControlTemplate.Triggers>
    <MultiTrigger>
        <!-- selected, but not focused -->
        <MultiTrigger.Conditions>
            <Condition Property="Selector.IsSelectionActive" Value="False" />
            <Condition Property="IsSelected" Value="True" />
        </MultiTrigger.Conditions>
        <Setter Property="Background" TargetName="Bd" Value="Yellow" />
    </MultiTrigger>
    <MultiTrigger>
        <!-- selected, and focused -->
        <MultiTrigger.Conditions>
            <Condition Property="Selector.IsSelectionActive" Value="True" />
            <Condition Property="IsSelected" Value="True" />
        </MultiTrigger.Conditions>
        <Setter Property="Background" TargetName="Bd" Value="Red" />
        <Setter Property="Foreground" Value="White" />
    </MultiTrigger>                    
</ControlTemplate.Triggers>
于 2017-06-09T18:56:20.983 に答える