Нажмите на элемент WPF с более низким ZOrder и без использования IsHitTestVisible.

Чтобы упростить задачу, у меня есть следующий XAML Windows:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525"
    DataContext="{StaticResource MainViewModel}">
<Grid>
    <Button Click="Button_Click">Click Me</Button>
    <ListBox ItemsSource="{Binding Items}" Background="{x:Null}">
    </ListBox>
</Grid>
</Window>

Когда он запускается, он выглядит так: введите здесь описание изображения

Чего я ожидаю, так это:

  • Я могу выбирать элементы ( WpfApplication1.BusinessObject )
  • И также можно нажать на кнопку (поскольку я отметил фон как {x:Null})

Но я не могу нажать на кнопку, только выбрать элементы в списке. Примечание. Если я использую IsHitTestVisible, я могу щелкнуть по кнопке, но не по элементам, что имеет смысл. Мне также абсолютно необходимо, чтобы и список, и кнопка занимали все окна. Наличие сверху списка и кнопки внизу не является решением.

Есть ли хороший способ заставить это работать?

Спасибо за вашу помощь !


person Laurent    schedule 28.07.2015    source источник
comment
Вы просто накладываете элементы управления друг на друга. Попробуйте панель стека или добавьте несколько строк в свою сетку и назначьте поле со списком одной строке, а кнопку — другой.   -  person sous2817    schedule 28.07.2015


Ответы (4)


вы можете попробовать поместить свой список и кнопку в Стековая панель

также не похоже, что ваша кнопка привязана к каким-либо действиям, может ли это быть причиной :)?

person classicalConditioning    schedule 28.07.2015
comment
Спасибо за ваш ответ, на самом деле он привязан к простому событию Click. Но, как я уже упоминал, я хочу, чтобы и Button, и lisbox полностью заполнили Windows, один поверх другого (говоря по Z-порядку). Образец извлечен из сложного приложения. - person Laurent; 29.07.2015

Другой вариант, если вы хотите, чтобы список располагался поверх вашей кнопки и частично закрывал ее, — это установить `VerticalAlignment="Top" в вашем списке. Это позволит списку расти вертикально, и только высота списка будет закрывать кнопку. Однако, если в списке много элементов, он полностью закроет кнопку, и вы не сможете ее нажать.

Вы всегда можете добавить обработчик PreviewMouseDown в список и активировать нажатие кнопки или команду. Таким образом, если список заполнит все окно, вы все равно сможете вызвать обработчик кнопки.

person evanb    schedule 28.07.2015

Взгляните на эту тему: Canvas в ScrollViewer (предварительная версия) Порядок событий MouseButtonDown

Проблема заключается в том, что ScrollViewer обрабатывает события мыши. Вы можете реализовать свой собственный шаблон ListBox и использовать собственный производный класс ScrollViewer с изменениями кода, показанными в упомянутом потоке.

person dotsven    schedule 28.07.2015
comment
Спасибо, это указывает мне правильное направление, черпайте вдохновение из: «> stackoverflow.com/questions/31103891/ Я полностью удалил ScrollViewer, и это сработало. я опубликую ответ - person Laurent; 29.07.2015

Спасибо dotsven, настройка handle=false у меня не сработала, но я нашел этот вопрос, который мне помог: Перейдите через ListBox к основному элементу управления. Вдохновленный этим, я удалил ScrollViewer, установив новый стиль для моего listbox, и это сработало:

<Style x:Key="{x:Type ListBox}" TargetType="ListBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBox}">
                <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true">
                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Мне также пришлось оставить фон {x:Null} :

<ListBox ItemsSource="{Binding Items}" Background="{x:Null}" Height="65" Width="242"/>

Спасибо всем за вашу помощь!

person Laurent    schedule 29.07.2015