画像とボタンを含むリストボックスがあります。デフォルトでは、ボタンは非表示になっています。リストボックスのアイテムにカーソルを合わせるとボタンが表示されるようにしたい。私が使用しているXAMLは以下のとおりです。ありがとう
<Window.Resources>
<Style TargetType="{x:Type ListBox}">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="1" Margin="6">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Path=FullPath}" Height="150" Width="150"/>
<Button x:Name="sideButton" Width="20" Visibility="Hidden"/>
</StackPanel>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
OK、ボタン宣言でこれを試してください:
<Button x:Name="sideButton" Width="20">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Visibility" Value="Hidden" />
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsMouseOver}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
したがって、ListBoxItem
が見つかるまでトリガー付きのスタイルを使用してビジュアルツリーを調べ、IsMouseOver
プロパティがTrue
に切り替わるときに、 button
のVisible
への可視性。
それがあなたが望むものに近いかどうか見てください。
このStyle
は必要なことを行います。マウスオーバーでは、ボタンがListBoxItem
の上にあるときにのみボタンが表示されます。特別なトリックは、TemplatedParent
にバインドしてIsMouseOver
に到達し、TargetName
でSetter
を使用してButton
のみに影響を与えることです。
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="Black"
BorderThickness="1"
Margin="6">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Path=FullPath}"
Height="150"
Width="150" />
<Button x:Name="sideButton"
Width="20"
Visibility="Hidden" />
</StackPanel>
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsMouseOver,RelativeSource={RelativeSource TemplatedParent}}"
Value="True">
<Setter Property="Visibility"
TargetName="sideButton"
Value="Visible" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
@Davidは正しい方法を示していますが、私はあなたのXAMLアーキテクチャに対して1つの提案をしています。ボタンにDataBindingがない場合は、次のように、DataTemplateよりもListBoxItemスタイルに配置することをお勧めします。
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Border BorderBrush="Black"
BorderThickness="1"
Margin="6">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Path=FullPath}"
Height="150"
Width="150" />
</StackPanel>
</Border>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Grid Background="Transparent">
<Button x:Name="sideButton" Width="20" HorizontalAlignment="Right" Visibility="Hidden" />
<ContentPresenter/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Visibility"
TargetName="sideButton"
Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
上記の手法を使用する場合、ボタンがクリックされたアイテムをどのように判断するのでしょうか。
ブライアンの質問に答えるために、ボタンクリックハンドラーで、ビジュアルツリーを上に移動して、ボタンを含むアイテムを見つけることができます。
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is ListBoxItem))
{
dep = VisualTreeHelper.GetParent(dep);
}
if (dep != null)
{
// TODO: do stuff with the item here.
}
クリックされたアイテムを見つける1つの解決策は、次のイベントセッターを追加することです。
XAML
C#void ListBoxItem_MouseEnter(object sender、MouseEventArgs e){_memberVar =(sender as ListBoxItem).Content; }