首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用触发器对相同绑定/开关控件的MultiTrigger条件

使用触发器对相同绑定/开关控件的MultiTrigger条件
EN

Stack Overflow用户
提问于 2019-11-08 10:09:22
回答 1查看 299关注 0票数 1

我试图让p:MarqueeTextBlock只在ListBox IsSelected上滚动TargetType="{x:Type ListBoxItem}"

难以计算添加MultiTrigger条件(当IsSelected变为TrueFalse时触发)以将p:MarqueeTextBlockProperty="Scroll"更改为OffLeftTypewriter。此外,不确定如何在p:MarqueeTextBlock中引用DataTemplate;也许如果我提供一个x:Name呢?但是我得到了Template property has already been set on DataTemplate

我需要以某种方式在AOTbMain_MARQUEE中添加x:Key="ListBoxStyle_GAME",例如:

代码语言:javascript
复制
<p:MarqueeTextBlock Text="{Binding Path=Title}" Style="{StaticResource AOTbMain_MARQUEE}"/>

以上引用的代码未添加:

代码语言:javascript
复制
<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:p="clr-namespace:Plugin.Controls;assembly=Plugin.v1"
    mc:Ignorable="d"
    d:DesignHeight="2160" d:DesignWidth="3840">

    <UserControl.Resources>
        <ResourceDictionary>
            <Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <Grid>
                                <Image x:Name="SelectedGameOverlay" Source="{}pack://siteoforigin:,,,/Images/Selected Game Overlay.png" RenderOptions.BitmapScalingMode="HighQuality" Visibility="Hidden" />
                                <ContentPresenter x:Name="SelectedGameTextColour" HorizontalAlignment="Left" />
                            </Grid>
                            <ControlTemplate.Triggers>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="Selector.IsSelectionActive" Value="False" />
                                        <Condition Property="IsSelected" Value="True" />
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Opacity" Value="1" />
                                    <Setter TargetName="SelectedGameOverlay" Property="Visibility" Value="Visible" />
                                    <Setter TargetName="SelectedGameTextColour" Property="TextElement.Foreground" Value="#FFFFFF" />
                                </MultiTrigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="Selector.IsSelectionActive" Value="True" />
                                        <Condition Property="IsSelected" Value="True" />
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Opacity" Value="1" />
                                    <Setter TargetName="SelectedGameOverlay" Property="Visibility" Value="Visible" />
                                    <Setter TargetName="SelectedGameTextColour" Property="TextElement.Foreground" Value="#FFFFFF" />
                                </MultiTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <Style x:Key="ListBoxStyle" TargetType="p:AutoscrollListBox">
                <Setter Property="ItemContainerStyle" Value="{StaticResource ListBoxItemStyle}" />
                <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
                <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled" />
                <Setter Property="Background" Value="Transparent" />
                <Setter Property="BorderThickness" Value="0" />
            </Style>

            <Style x:Key="ListBoxStyle_BASE" TargetType="p:AutoscrollListBox" BasedOn="{StaticResource ListBoxStyle}">
                <Setter Property="ScrollMode" Value="Center" />
                <Setter Property="ItemContainerStyle">
                    <Setter.Value>
                        <Style TargetType="ListBoxItem" BasedOn="{StaticResource ListBoxItemStyle}">
                            <Setter Property="Padding" Value="1" />
                        </Style>
                    </Setter.Value>
                </Setter>
            </Style>

            <Style x:Key="AOTbMain_MARQUEE" TargetType="p:MarqueeTextBlock">
                <Setter Property="Scroll" Value="LeftTypewriter" />
                <Setter Property="ScrollDelayBeg" Value="0:0:5" />
                <Setter Property="ScrollDelayEnd" Value="0:0:3" />
                <Setter Property="ScrollSpeed" Value="0:0:5" />
            </Style>

            <Style x:Key="ListBoxStyle_BASE_INDXFADER" TargetType="p:AutoscrollListBox" BasedOn="{StaticResource ListBoxStyle_BASE}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IndexVisibility}" Value="Visible">
                        <Setter Property="Opacity" Value="0.1" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding IndexVisibility}" Value="Hidden">
                        <Setter Property="Opacity" Value="1" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>

            <Style x:Key="ListBoxStyle_BASETB" TargetType="p:AutoscaleTextBlock">
                <Setter Property="TextTrimming" Value="CharacterEllipsis" />
                <Setter Property="TargetFontSize" Value="30" />
            </Style>

            <Style x:Key="ListBoxStyle_GAME" TargetType="p:AutoscrollListBox" BasedOn="{StaticResource ListBoxStyle_BASE_INDXFADER}">
                <Setter Property="ItemTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <p:AutoscaleTextBlock Text="{Binding Path=Title}" Style="{StaticResource ListBoxStyle_BASETB}" />
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <Style x:Key="ListBoxItemStyleSearch" TargetType="ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <Grid>
                                <ContentPresenter x:Name="SelectedSearchTextColour" />
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True" />
                                    <Setter Property="Opacity" Value="1" />
                                    <Setter TargetName="SelectedSearchTextColour" Property="TextElement.Foreground" Value="#FFFFFF" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <Style x:Key="ListBoxStyleSearch" TargetType="p:AutoscrollListBox">
                <Setter Property="ItemContainerStyle" Value="{StaticResource ListBoxItemStyleSearch}" />
                <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
                <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled" />
                <Setter Property="BorderBrush" Value="Transparent" />
                <Setter Property="Background" Value="Transparent" />
            </Style>

            <Style x:Key="ListBoxStyle_INDX" TargetType="p:AutoscrollListBox" BasedOn="{StaticResource ListBoxStyleSearch}">
                <Setter Property="ItemContainerStyle">
                    <Setter.Value>
                        <Style TargetType="ListBoxItem" BasedOn="{StaticResource ListBoxItemStyleSearch}">
                            <Setter Property="Padding" Value="1" />
                        </Style>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>

    <Grid>
        <Viewbox HorizontalAlignment="Left">
            <p:AutoscrollListBox Name="Index" Style="{StaticResource ListBoxStyle_INDX}" Visibility="{Binding IndexVisibility}" />
        </Viewbox>

        <p:AutoscrollListBox Name="Items" Style="{StaticResource ListBoxStyle_GAME}" />
    </Grid>
</UserControl>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 11:50:52

下面的Style将显示AutoscrollListBox作为DataTemplate的内容。一旦选择了ListBoxItem,它就会显示MarqueeTextBlock。如果未选中,它将切换回AutoscrollListBox

解决方案1

代码语言:javascript
复制
<Grid>
  <AutoscrollListBox Name="Items" >
    <AutoscrollListBox.ItemTemplate>
      <DataTemplate>
        <DataTemplate.Resources>
          <AutoscaleTextBlock x:Key="AutoscaleTextBlock" 
                              Text="{Binding Title}" 
                              Style="{StaticResource ListBoxStyle_BASETB}"
                              x:Shared="False" />
          <MarqueeTextBlock x:Key="MarqueeTextBlock"
                            Text="{Binding Title}"                           
                            Style="{StaticResource AOTbMain_MARQUEE}"
                            x:Shared="False" />
        </DataTemplate.Resources>

        <ContentControl x:Name="ContentPresenter" />

        <DataTemplate.Triggers>
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}" 
                       Value="False">
            <Setter TargetName="ContentPresenter" 
                    Property="Content" 
                    Value="{StaticResource AutoscaleTextBlock}"/>
          </DataTrigger>
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}" 
                       Value="True">
            <Setter TargetName="ContentPresenter" 
                    Property="Content" 
                    Value="{StaticResource MarqueeTextBlock}"/>
          </DataTrigger>
        </DataTemplate.Triggers>
      </DataTemplate>
    </AutoscrollListBox.ItemTemplate>
  </AutoscrollListBox>
</Grid>

解决方案2

如果您正在使用嵌套资源字典,并且无法应用x:Shared属性,则可以直接从Trigger交换控件

代码语言:javascript
复制
<Grid>
  <AutoscrollListBox Name="Items" >
    <AutoscrollListBox.ItemTemplate>
      <DataTemplate>
        <ContentControl x:Name="ContentPresenter" />

        <DataTemplate.Triggers>
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}" 
                       Value="False">
            <Setter TargetName="ContentPresenter" 
                    Property="Content">
              <Setter.Value>
                <AutoscaleTextBlock Text="{Binding Title}"                           
                                    Style="{StaticResource AOTbMain_MARQUEE}" />
               </Setter.Value>
             </Setter>
          </DataTrigger>
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}" 
                       Value="True">
            <Setter TargetName="ContentPresenter" 
                    Property="Content">
              <Setter.Value>
                <MarqueeTextBlock Text="{Binding Title}"                           
                                  Style="{StaticResource AOTbMain_MARQUEE}"/>
               </Setter.Value>
             </Setter>
          </DataTrigger>
        </DataTemplate.Triggers>
      </DataTemplate>
    </AutoscrollListBox.ItemTemplate>
  </AutoscrollListBox>
</Grid>

解决方案3

或者切换Visibility

代码语言:javascript
复制
<Grid>
  <AutoscrollListBox Name="Items" >
    <AutoscrollListBox.ItemTemplate>
      <DataTemplate>
        <Grid>
          <AutoscaleTextBlock x:Name="AutoscaleTextBlock" 
                              Text="{Binding Title}"                           
                              Style="{StaticResource AOTbMain_MARQUEE}"
                              Visibilty="Visible" />
           <MarqueeTextBlock x:Name="MarqueeTextBlock" 
                             Text="{Binding Title}"                           
                             Style="{StaticResource AOTbMain_MARQUEE}"
                             Visibilty="Collapsed" />
        </Grid>

        <DataTemplate.Triggers>
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem}, Path=IsSelected}" 
                       Value="True">
            <Setter TargetName="AutoscaleTextBlock" 
                    Property="Visibility"
                    Value="Collapsed" />
            <Setter TargetName="MarqueeTextBlock" 
                    Property="Visibility"
                    Value="Visible" />
          </DataTrigger>
        </DataTemplate.Triggers>
      </DataTemplate>
    </AutoscrollListBox.ItemTemplate>
  </AutoscrollListBox>
</Grid>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58764464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档