Выставочная кнопка поля списка WPF в ItemTemplate на MouseOver

В вашем классе есть три различных метода.

Первые методы доступа (также называемые геттерами), которые возвращают значение из класса, у них не должно быть параметров и типа возврата для любого возвращаемого ими значения, например,

// 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;
}
33
задан 15 October 2008 в 21:09
поделиться

5 ответов

Хорошо, попробуйте это в своем объявлении кнопки:

<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.

Видят, ли это близко к тому, что Вы хотите.

44
ответ дан 27 November 2019 в 18:11
поделиться

Это 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>
14
ответ дан 27 November 2019 в 18:11
поделиться

@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>
5
ответ дан 27 November 2019 в 18:11
поделиться

Одно из решений, чтобы узнать, какой элемент был нажат, - это добавить следующий установщик событий

XAML

C # void ListBoxItem_MouseEnter (отправитель объекта, MouseEventArgs e) { _memberVar = (отправитель как ListBoxItem) .Content; }

0
ответ дан 27 November 2019 в 18:11
поделиться

Просто интересно, если мы используем приведенную выше технику, как мы определим, на каком элементе была нажата кнопка?

Чтобы ответить на вопрос Брайана, в обработчике нажатия кнопки вы можете подняться по визуальному дереву, чтобы найти элемент, содержащий кнопку:

        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.
        }
0
ответ дан 27 November 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: