私は、WPF、C#とそのすべての良いもの(Visual Studio 2010も)を使用するプロジェクトを持っています。WPF ControlTemplateトリガー
私はWPF ListBoxを持っており、そのListBox内にListBoxItemのコントロールテンプレートがあります。その中にはトリガーのセクションがあります。
この特定のケースでは、トリガプロパティはIsSelectedで、ListBoxの選択項目を参照します。
私がしたいことは、これをListBoxコントロールから取り出し、それをリソースリストのControlTemplateに入れることです。
これを行うと、フレームワーク要素内に「IsSelected」が存在しないことが正しく伝えられます。
誰かがこれを完了する方法についていくつかの示唆を与えることができますか?
ありがとうございました。
ああ、XAMLコードはここにある:
<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>
は編集:
<Trigger Property="{Binding Path=IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" Value="true">
は、しかし、私はエラーが「『』バインディングが上に設定することができないと言ってます:私はこれを試してみました'トリガ'タイプの 'プロパティ'プロパティ。
エクストラ編集:あなたはここにコントロールテンプレートのトリガーを見ればそう、それは(「_Border」と呼ばれる)の境界線に適用されます
<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>
:さてさて、ここでのListBoxのためのXAMLです。今問題は、これは、(NodeVisualTemplateと呼ばれる)ListBoxItemのコントロールテンプレートとは別に、ボーダーを私に残すことです。 NodeVisualTemplateにその境界線を配置したいのですが、IsSelectedプロパティへのリンクをどのように保持するかについてはわかりません。それはちょっと問題の根源です。
これはListBoxではなくListBoxItemテンプレートの一部であるようです。 – Clemens
XAML、おそらくControlTemplate全体を共有する必要があります。おそらくListBoxのXAML全体です。 –
申し訳ありません、私はいくつかの情報でそれを更新しました。 – TheFaithfulLearner