WPF组合框弹出位置:靠下并与右边缘对齐

9cbw7uwe  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(277)

我正在尝试创建一个非标准下拉对齐的ComboBox。基本上,我希望下拉菜单在ComboBox的下方,但与ComboBox的右边缘对齐,而不是左边缘。
使用PlacementMode="Bottom"时,正常的ComboBox是什么样子的:

我想要的:

我试着在我的ComboBox模板中使用Popup.PlacementMode属性,但是似乎没有一个可能的值能满足我的需要。有没有简单的方法可以做到这一点,最好是在纯XAML中?

vcudknz3

vcudknz31#

当我打开Expression Blend时,我在几秒钟内就找到了解决方案:

<Popup Placement="Left" VerticalOffset="{TemplateBinding ActualHeight}" 
       HorizontalOffset="{TemplateBinding ActualWidth}"

有时这个应用程序比手工编写xaml更有用,但不是经常。

fkaflof6

fkaflof62#

我将对PopUp使用“Custom”placementmode,并声明一个回调函数将弹出控件放置到正确的位置,如下所示:WPF ComboBox DropDown Placement
看看下面的示例是否适合您:

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

        var popup = (Popup)Template.FindName("PART_Popup", this);
        popup.Placement = PlacementMode.Custom;
        popup.CustomPopupPlacementCallback += (Size popupSize, Size targetSize, Point offset) => 
            new[] {  new CustomPopupPlacement() { Point = new Point (targetSize.Width-popupSize.Width, targetSize.Height) } };
    }
}

我希望这能帮上忙,问候

66bbxpm5

66bbxpm53#

有人可以张贴完整的xaml代码吗?
我尝试了以下方法:

<ComboBox Grid.Column="1" Height="24" Width="20" HorizontalAlignment="Right"
              VerticalAlignment="Top"                  
              Name="comboBox2" 
              ItemsSource="{Binding  Source={StaticResource FilterTypes}}" 
              SelectedValue="{Binding Path=SelectedType, Mode=TwoWay}" >

        <ComboBox.Template>
            <ControlTemplate>
                <Popup Placement="Left" VerticalOffset="{TemplateBinding ActualHeight}" 
                        HorizontalOffset="{TemplateBinding ActualWidth}" />
            </ControlTemplate>
        </ComboBox.Template>  
    </ComboBox>

...经过一些工作和测试,我找到了一个很好的解决方案...

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

huus2vyu4#

这是一个有点hacky,但工作。你只需要改变组合框的风格。

<Grid Height="40">
        <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
            <FrameworkElement Name="dummy" Visibility="Collapsed">
                <FrameworkElement.RenderTransform>
                    <TransformGroup x:Name="xformgrp">
                        <TranslateTransform X="{Binding ElementName=PopupContent, Path=ActualWidth}" />
                        <ScaleTransform ScaleX="-1" />
                        <TranslateTransform X="{Binding ElementName=chk, Path=ActualWidth}" />
                    </TransformGroup>
                </FrameworkElement.RenderTransform>
            </FrameworkElement>
            <CheckBox Name="chk" HorizontalAlignment="Center">checkthisout</CheckBox>
            <Popup IsOpen="{Binding IsChecked, ElementName=chk}" PlacementTarget="{Binding ElementName=chk}" Placement="Bottom" HorizontalOffset="{Binding ElementName=dummy, Path=RenderTransform.Value.OffsetX}">
                <TextBlock Name="PopupContent" Foreground="Yellow" Background="Blue">yeah long popupcontent</TextBlock>
            </Popup>
        </Grid>            
    </Grid>

弹出窗口的水平偏移量只需要得到PopupContent. ActualWidth-PlacementTarget. ActualWidth的值。为了得到这个值,我使用了this trick from Charles Petzold

相关问题