2016-07-13 19 views
1

我有一個組合框的項目比實際組合框的寬度更寬,下拉向右溢出。 我們如何使組合框彈出向左而不是右側。如何製作一個wpf組合框彈出左

FlowDirection不會這樣做。

在建議的線程中建議的解決方案將使左側組合框的箭頭。我需要它保持在正確的位置。

<ComboBox.Style> 
     <Style TargetType="ComboBox" >          
      <Setter Property="Popup.FlowDirection" Value="RightToLeft"/>     
     </Style> 
    </ComboBox.Style> 
+1

這線程可能會有所幫助:http://stackoverflow.com/questions/5340640/wpf-combobox-popup-placement-bottom-and-aligned-to-the-right對邊 – geostocker

+0

當我搜索時,我遇到了這個線程,但它沒有達到我要找的。 – TheOne

+0

任何想法傢伙? – TheOne

回答

2

我建議你以操縱其Popup控制擴展標準ComboBox控制。在我看來,這是針對您的問題的最簡單和最快的解決方案。

public class LeftComboBox : ComboBox 
{ 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     Popup popup = GetTemplateChild("PART_Popup") as Popup; 
     popup.Placement = PlacementMode.Custom; 
     popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(CustomPopupPlacementCallback); 
    } 

    private static CustomPopupPlacement[] CustomPopupPlacementCallback(Size popupSize, 
     Size targetSize, Point offset) 
    { 
     Point point = new Point(targetSize.Width - popupSize.Width, targetSize.Height); 

     List<CustomPopupPlacement> customPopupPlacement = 
      new List<CustomPopupPlacement>(); 

     customPopupPlacement.Add(new CustomPopupPlacement(point, PopupPrimaryAxis.Vertical)); 

     return customPopupPlacement.ToArray(); 
    } 
} 

通過擴展標準ComboBox控制您可以覆蓋OnApplyTemplate,你可以強制其Popup使用自定義PlacementMode。您可以編寫自己的CustomPopupPlacementCallback。我只是改變了水平偏移量Popup,向左移動。

我希望它能幫助你。

0

我建議這樣做,與Behavior.I'm例如添加菜單項帶,但它同樣與彈出(如組合框)

在XAML中任何控制的附加行爲添加到菜單項:

 <Menu> 
      <MenuItem ItemsSource="{Binding GlanceOptions, Mode=OneWay}"> 

       <interactivity:Interaction.Behaviors> 
        <behaviors:MenueItemSubMenuPlacementBehavior /> 
       </interactivity:Interaction.Behaviors> 

       <MenuItem.Header> 
        <Border      
         Cursor="Arrow" 
         BorderThickness="1,1,1,0" > 
         <Path x:Name="DropDownIcon" 
             VerticalAlignment="Center" 
             Data="M0,0L2,3 4,0z" 
             /> 
        </Border> 
       </MenuItem.Header> 
      </MenuItem > 
     </Menu>   

行爲守則:

 public class MenueItemSubMenuPlacementBehavior : Behavior<MenuItem> 
     { 
      private PlacementMode _previousPlacementMode; 
      private CustomPopupPlacementCallback _previousCallback; 
      private Popup _menuItemPopUp; 

      protected override void OnAttached() 
      { 
       base.OnAttached(); 

       Initialize(); 
      } 

      private void Initialize() 
      { 
       if (AssociatedObject == null) 
        return; 

       if (_menuItemPopUp == null) 
       { 
        _menuItemPopUp = AssociatedObject?.Template?.FindName("PART_Popup", AssociatedObject) as Popup; 

        if (_menuItemPopUp == null) 
        { 
         AssociatedObject.Loaded -= AssociatedObject_Loaded; 
         AssociatedObject.Loaded += AssociatedObject_Loaded; 
         return; 
        } 

        _previousPlacementMode = _menuItemPopUp.Placement; 
        _previousCallback = _menuItemPopUp.CustomPopupPlacementCallback; 

        _menuItemPopUp.Placement = PlacementMode.Custom; 
        _menuItemPopUp.CustomPopupPlacementCallback = CustomPopupPlacementCallback; 
       } 
      } 

      private void AssociatedObject_Loaded(object sender, RoutedEventArgs e) 
      { 
       AssociatedObject.Loaded -= AssociatedObject_Loaded; 

       if (_menuItemPopUp != null) 
        return; 

       _menuItemPopUp = VisualTreeHelpers.FindFirstChild<Popup>(AssociatedObject) as Popup; 

       if (_menuItemPopUp == null) 
        return; 

       _previousPlacementMode = _menuItemPopUp.Placement; 
       _previousCallback = _menuItemPopUp.CustomPopupPlacementCallback; 

       _menuItemPopUp.Placement = PlacementMode.Custom; 
       _menuItemPopUp.CustomPopupPlacementCallback = CustomPopupPlacementCallback; 
      } 

      protected override void OnDetaching() 
      { 
       base.OnDetaching(); 

       if(AssociatedObject != null) 
       { 
        AssociatedObject.Loaded -= AssociatedObject_Loaded; 
       } 

       if (_menuItemPopUp != null) 
       { 
        _menuItemPopUp.Placement = _previousPlacementMode; 
        _menuItemPopUp.CustomPopupPlacementCallback = _previousCallback; 

        _previousCallback = null; 
       } 
      } 

      private CustomPopupPlacement[] CustomPopupPlacementCallback(Size popupSize, Size targetSize, Point offset) 
      { 
       var rightPlacedPopupX = offset.X; 
       var rightPlacedPopupY = offset.Y + (AssociatedObject.ActualHeight * YourLogic); 

       return new[] 
       { 
        new CustomPopupPlacement(new Point(rightPlacedPopupX, rightPlacedPopupY), PopupPrimaryAxis.Horizontal), 
       }; 
      } 
     } 
相關問題