在窗口范围内保持弹出窗口

时间:2014-01-29 12:41:36

标签: c# wpf popup

我正在尝试在按钮下显示弹出窗口。

这就是现在的样子:

enter image description here 但我希望它保持在窗口边界内,就像这样(油漆中的例子)

enter image description here

这是我在顶部声明弹出窗口的顶栏:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="55" />
        <RowDefinition Height="35" />
    </Grid.RowDefinitions>

    <Grid x:Name="AdminContainer" Grid.Row="0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="4*" />
            <ColumnDefinition Width="10" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <Border Background="Transparent">
            <Viewbox StretchDirection="DownOnly" Stretch="Uniform" Height="35" HorizontalAlignment="Left" Margin="10,0,0,0">
                <ContentControl Content="{StaticResource LynxLogo}" Margin="0,5" />
            </Viewbox>
        </Border>

        <ToggleButton x:Name="AdminOptionsToggleButton" 
                      Grid.Column="2" 
                      VerticalAlignment="Center"
                      HorizontalAlignment="Stretch"
                      IsChecked="{Binding mainViewModel.OptionsPopupOpen, Mode=TwoWay}"
                      Style="{StaticResource EmptyToggleButtonStyle}"
                      Cursor="Hand">

            <Grid x:Name="AdminPanel" HorizontalAlignment="Right" Height="45"
                  VerticalAlignment="Stretch" Margin="0,0,2,0" >
                <Grid.Style>
                    <Style>
                        <Setter Property="Grid.Background" Value="Transparent"/>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ToggleButton}, Path=IsMouseOver}" Value="True">
                                <Setter Property="Grid.Background" Value="#FF404040"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ToggleButton}, Path=IsChecked}" Value="True">
                                <Setter Property="Grid.Background" Value="#FF353535"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Grid.Style>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="45" />
                </Grid.ColumnDefinitions>


                <Border Grid.Column="0" Padding="20,0,0,0">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>

                        <!--Name-->
                        <TextBlock Grid.Row="0" Text="{Binding adminViewModel.Name}"
                                   Style="{StaticResource AdminTextBlockStyle}" VerticalAlignment="Bottom"
                                   FontSize="16" />
                        <!--Status-->
                        <TextBlock Grid.Row="1" Text="{Binding adminViewModel.StatusDescription}"
                                   Style="{StaticResource AdminTextBlockStyle}" VerticalAlignment="Bottom"
                                   FontSize="13" Margin="0,0,0,1" />
                    </Grid>
                </Border>

                <Border Grid.Column="1" HorizontalAlignment="Right" Margin="3">
                    <Viewbox StretchDirection="DownOnly">
                        <Image x:Name="ProfilePicture" Source="/Image/ProfilePictures/profile_placeholder.png" />
                    </Viewbox>
                </Border>
            </Grid>
        </ToggleButton>
    </Grid>

    <views:OptionPopup x:Name="OptionsMenu" PlacementTarget="{Binding ElementName=AdminPanel}"
                       Placement="Bottom" 
                       MinWidth="{Binding ActualWidth, ElementName=AdminPanel}"
                       MaxWidth="{Binding ActualWidth, ElementName=AdminContainer}" />

2 个答案:

答案 0 :(得分:3)

我通过设置自定义位置来修复它:

<views:OptionPopup x:Name="OptionsMenuPopup"
     PlacementTarget="{Binding ElementName=AdminPanel}"
     Placement="Custom"
     MinWidth="{Binding ActualWidth, ElementName=AdminPanel}"
     MaxWidth="{Binding ActualWidth, ElementName=AdminContainer}" /> 

在我后面的代码中我的usercontrol的构造函数中添加了

OptionsMenuPopup.CustomPopupPlacementCallback += (Size popupSize, Size targetSize, Point offset) =>
            new[] { new CustomPopupPlacement() { Point = new Point(targetSize.Width - popupSize.Width, targetSize.Height) } }; 

答案 1 :(得分:0)

您可以使用SystemParameters.PrimaryScreenHeight的组合和Popup的左上角来计算您有多少空间,并将其设置为Popup内容的MaxHeight和MaxWidth。