Wpf Размещение всплывающих окон - PullRequest
5 голосов
/ 19 октября 2010

Есть ли шанс, что я могу разместить всплывающее окно рядом с элементом из ListBox? Я использую MVVM, список привязан к элементам, а для некоторых выбранных элементов я хочу показать всплывающее окно рядом с элементом.

У меня есть список элементов, и я хочу показать всплывающее окно при нажатии на указанный элемент списка, но всплывающее окно должно отображаться рядом с выбранным элементом списка.

Я пробовал что-то вроде этого (это не работает):

    <Popup  IsOpen="{Binding Path=ShowPopup}" PlacementTarget="{Binding ElementName=List1, Path=SelectedItem}" Placement="Center">
        <TextBox Background="Red" Height="120" Text="Aaaaaa FUUUUUUUUUUUUU....."></TextBox>
    </Popup>

Я не хочу использовать код позади, только xaml

Ответы [ 3 ]

6 голосов
/ 25 октября 2010

Это поместит всплывающее окно справа от выбранного ListBoxItem

alt text

Пример

<Window.Resources>
    <SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD" />
    <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />

    <ControlTemplate x:Key="PopupListBoxItemTemplate" TargetType="ListBoxItem">
        <Border Name="Border" Padding="2" SnapsToDevicePixels="true">
            <Grid>
                <Popup Name="c_popup" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" >
                    <Border BorderBrush="Black" BorderThickness="1" CornerRadius="2.5">
                        <TextBlock Background="Wheat" Foreground="Black" Text="Aaaaaa FUUUUUUUUUUUUU....."/>
                    </Border>
                </Popup>
                <ContentPresenter />
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsSelected" Value="true">
                <Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
                <Setter TargetName="c_popup" Property="IsOpen" Value="True"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Window.Resources>
<Grid>
    <ListBox Name="listBox"
             ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Template" Value="{StaticResource PopupListBoxItemTemplate}" />
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
</Grid>
2 голосов
/ 19 октября 2010

Причина, по которой ваш пример не работает, состоит в том, что вы просто привязываете цель размещения к не-пользовательскому объекту.

PlacementTarget="{Binding ElementName=List1, Path=SelectedItem}"

SelectedItem в этом случае может быть моделью модель / представление, которая представляет элемент в вашем списке, поэтому не правильно использовать свойство PlacementTarget.

Вам нужно установить PlacementTarget для ItemContainer ( Д-р. WPF объясняет ), и это невозможно без помощи «некоторых» кодов.

Теперь, когда вы знаете проблему, есть несколько способов заставить ваш код работать, поэтому я оставлю это на ваше усмотрение.

2 голосов
/ 19 октября 2010

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

<Popup  IsOpen="{Binding Path=ShowPopup}" Placement="Mouse">
     <TextBox Background="Red" Height="120" Text="Aaaaaa FUUUUUUUUUUUUU....."></TextBox>
 </Popup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...