2017-09-05 3 views
-1

Ich habe ein Projekt, das WPF, C# und all die guten Sachen (Visual Studio 2010 auch) verwendet.WPF ControlTemplate Triggers

Ich habe eine WPF-ListBox und innerhalb dieser ListBox gibt es eine Steuerelementvorlage für das ListBoxItem. Darin befindet sich ein Abschnitt für Trigger.

In diesem speziellen Fall ist die Trigger-Eigenschaft IsSelected und bezieht sich auf das ausgewählte Element für die ListBox.

Was ich tun möchte, ist Dinge zu bereinigen, indem Sie dies aus dem ListBox-Steuerelement nehmen und es in eine ControlTemplate in einer Ressourcenliste einfügen.

Wenn ich das tue, sagt es mir zu Recht, dass es kein 'IsSelected' innerhalb des Framework-Elements gibt.

Kann jemand einige Vorschläge machen, wie man das erledigt?

Danke.

Oh, ist der XAML-Code hier:

<ControlTemplate.Triggers> 
       <Trigger Property="IsSelected" Value="true"> 
        <Setter TargetName="_Border" Property="Effect"> 
         <Setter.Value> 
          <DropShadowEffect ShadowDepth="0" Color="Black" Opacity="1" BlurRadius="20" /> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
      </ControlTemplate.Triggers> 

Edit: Ich tat dies versuchen:

<Trigger Property="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" Value="true"> 

Allerdings bekomme ich eine Fehlermeldung, ‚A 'Bindung' kann nicht auf die eingestellt werden Eigenschaft 'Property' vom Typ 'Trigger' '.

Extra-edit: Okay, hier ist die XAML für die List-Box:

<ListBox ItemsSource="{Binding ChatNodeListViewModel.ChatNodeVMs, Source={StaticResource Locator}}" Background="Transparent" Name="LbNodes" SelectedItem="{Binding ChatNodeListViewModel.SelectedNode, Source={StaticResource Locator}}" > 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Canvas HorizontalAlignment="Left" VerticalAlignment="Top" Width="2000" Height="1600"/> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
      <ListBox.ItemContainerStyle> 
       <Style TargetType="{x:Type ListBoxItem}"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="ListBoxItem"> 

           <Border x:Name="_Border" Padding="1" SnapsToDevicePixels="true" BorderThickness="3" Margin="2" CornerRadius="5,5,5,5" BorderBrush="{Binding IsHeadNode, Converter={StaticResource ResourceKey=HeadNodeToLinearGradientBrushConverter}}" > 

            <ContentPresenter /> 
           </Border> 

           <ControlTemplate.Triggers> 
            <Trigger Property="IsSelected" Value="true"> 
             <Setter TargetName="_Border" Property="Effect"> 
              <Setter.Value> 
               <DropShadowEffect ShadowDepth="0" Color="Black" Opacity="1" BlurRadius="20" /> 
              </Setter.Value> 
             </Setter> 
            </Trigger> 
           </ControlTemplate.Triggers--> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 

        <Setter Property="Canvas.Left" Value="{Binding XCoord}"/> 
        <Setter Property="Canvas.Top" Value="{Binding YCoord}"/> 
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="lb_PreviewMouseLeftButtonDown" /> 

       </Style> 
      </ListBox.ItemContainerStyle> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}"> 

          <i:Interaction.Triggers> 
           <i:EventTrigger EventName="DragDelta"> 
            <cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/> 
           </i:EventTrigger> 

          </i:Interaction.Triggers> 
         </Thumb> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

Also, wenn Sie an der Steuervorlage Auslöser hier, es bis an die Grenze (so genannten '_Border') angewandt wird. Jetzt ist das Problem, dass mir dieser Rand von der Kontrollschablone für das ListBoxItem (genannt NodeVisualTemplate) getrennt wird. Ich möchte diesen Rahmen in NodeVisualTemplate einfügen, aber ich bin mir nicht sicher, wie ich diesen Link zu der IsSelected-Eigenschaft beibehalten würde. Das ist irgendwie die Wurzel des Problems.

+1

scheint dieser Teil einer ListBoxItem Vorlage, nicht ListBox zu sein. – Clemens

+0

Sie müssen mehr XAML teilen, vielleicht das ganze ControlTemplate. Vielleicht das gesamte XAML für die ListBox. –

+0

Entschuldigung, ich habe es mit weiteren Informationen aktualisiert. – TheFaithfulLearner

Antwort

1

A Trigger nur können Sie eine Eigenschaft des Steuer nennen Sie Templating oder (wenn es ein Style-Trigger) Styling, sondern ein DataTrigger lässt Sie Trigger auf einen beliebigen Wert können Sie aus einem Binding zu bekommen.

Das ist viel leistungsfähiger. WPF's Binding Klasse kann viele verschiedene Dinge tun. Ich würde versuchen, dass in der Thumb Vorlage, mit einem RelativeSource, die Suche in der visuellen Struktur nach dem nächsten übergeordneten Steuerelement des Typs ListBoxItem suchen, und dann packt die IsSelected Eigenschaft der ListBoxItem. Die resultierende Vorlage Thumb wird nur bei Thumbs, die zu ListBoxItems gehören, sehr nützlich sein, aber das ist OK.

<DataTrigger 
    Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" 
    Value="true" 
    > 
    ... 
Verwandte Themen