2014-01-29 119 views
1

我试图显示一个按钮下的弹出。保持弹出窗口范围内

这是它看起来像现在:

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}" /> 
+0

尽管这将需要[读好一点] (http://msdn.microsoft.com/en-us/library/bb613596(v=vs.110).aspx)和试验和错误我相信你可以通过设置'Horizo​​ntalOffset'来实现这一点。 –

+1

通过给'PlacementTarget'弹出不会移出屏幕边界..这是一个内置函数在WPF ..弹出移出当前窗口或出屏幕? – Sankarann

回答

0

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

1

我固定它通过设置布局定制:

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

而且在我的用户的代码构造函数后面我加

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