В вашем классе есть три различных метода.
Первые методы доступа (также называемые геттерами), которые возвращают значение из класса, у них не должно быть параметров и типа возврата для любого возвращаемого ими значения, например,
// get the height of the box
double Box::getHeight()
{
return height;
}
Мутаторы (также известные как сеттеры) которые изменяют значение в классе, они должны иметь один параметр, который является новым значением для класса и типом возврата void
(то есть они ничего не возвращают). Например,
// set the height of the box to h
void Box::setHeight(double h)
{
height = h;
}
Наконец, есть методы, которые не являются ни аксессорами, ни мутаторами, ваш метод getParameters
является одним из них. Здесь нет жестких и быстрых правил, все зависит от того, что они делают. Ваш метод getParameters
на самом деле что-то печатает, поэтому getParameters
- это плохое имя, его следует называть printParameters
. Поскольку все, что он делает, это печатает что-то, он не должен ничего возвращать, ему также не нужны никакие параметры. Вот как это должно быть написано
// print the box parameters
void Box::printParameters()
{
cout << "\nDepth:" << getDepth() << endl <<
"Width:" << getWidth() << endl <<
"Height :" << getHeight() << endl;
}
Хорошо, попробуйте это в своем объявлении кнопки:
<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. Если у Вас нет DataBinding на Кнопке, лучше вставить это к стилю ListBoxItem, чем DataTemplate как рев.
<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>
Одно из решений, чтобы узнать, какой элемент был нажат, - это добавить следующий установщик событий
XAML
C # void ListBoxItem_MouseEnter (отправитель объекта, MouseEventArgs e) { _memberVar = (отправитель как ListBoxItem) .Content; }
Просто интересно, если мы используем приведенную выше технику, как мы определим, на каком элементе была нажата кнопка?
Чтобы ответить на вопрос Брайана, в обработчике нажатия кнопки вы можете подняться по визуальному дереву, чтобы найти элемент, содержащий кнопку:
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.
}