Почему мой WPF Popup не показывает, где он должен - PullRequest
1 голос
/ 07 февраля 2012

Я пытаюсь следовать этому руководству: http://www.jarloo.com/excel-like-autofilter-in-wpf/, чтобы добавить небольшое всплывающее окно при нажатии кнопки в заголовке столбца таблицы данных.Я добавил кнопку и значок фильтра в заголовок столбца и установил цель размещения всплывающего окна в качестве этой кнопки, но всплывающее окно всегда отображается в левом нижнем углу всего окна.

Есть идеи, почему?

Столбец DataGrid

    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="Images\bios.png" Width="16" Height="16"/>
                <TextBlock Text="Model" TextWrapping="Wrap" Padding="3"/>
                <Button Name="btnModelFilter" Margin="3,0,0,0" Click="btnModelFilter_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Images\filter.png" Width="10" Height="10"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>                    
</DataGridTemplateColumn>

Всплывающее окно

<Popup Name="popModel" Placement="Bottom" PlacementTarget="{Binding ElementName=btnModelFilter}" StaysOpen="False" Width="200">
    <Border Background="White" BorderBrush="Gray" BorderThickness="1,1,1,1">
        <StackPanel Margin="5,5,5,15">
            <StackPanel Orientation="Horizontal" Margin="0,0,0,15">
                <Button Margin="0,0,0,0" Name="btnSelectAll" Click="btnSelectAll_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <TextBlock Text="Select All" Foreground="Blue" Cursor="Hand" />
                        </ControlTemplate>
                    </Button.Template>
                </Button>

                <Button Margin="10,0,0,0" Name="btnUnselectAll" Click="btnUnselectAll_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <TextBlock Text="Select None" Foreground="Blue" Cursor="Hand" />
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </StackPanel>

            <ListBox x:Name="lstModels" BorderThickness="0">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Item}" Checked="ApplyFilters" Unchecked="ApplyFilters" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

        </StackPanel>
    </Border>
</Popup>

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

, поскольку атрибут Name вашей кнопки определен в DataTemplate, область действия имени не выходит за пределы этого DataTemplate, следовательно, кнопка не найдена, и PopUp отображается в значении 0,0.
Это правило области действиялогично, потому что представьте, что если вы повторно используете DataTemplate несколько раз, то одно и то же имя кнопки вызовет ошибку компилятора.
Вы можете определить всплывающее окно как стиль с ключом и включить его непосредственно в свой шаблон данных заголовка.

0 голосов
/ 07 февраля 2012

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

...