web-dev-qa-db-ja.com

WPF ComboBoxポップアップの配置:下部で右端に配置

非標準のドロップダウン配置でComboBoxを作成しようとしています。基本的に、ドロップダウンをComboBoxの下に配置しますが、左端ではなくComboBoxの右端に揃えます。

PlacementMode="Bottom"を使用した、通常のComboBoxの外観:

combo box aligned to the left

私が欲しいもの:

combobox aligned to the right

ComboBoxのテンプレートでPopup.PlacementModeプロパティを試してみましたが、可能な値のどれも私が望むことをしていないようです。できれば純粋なXAMLでそれを行う簡単な方法はありますか?

21
Thomas Levesque

Expression Blendを開いたとき、数秒以内に解決策を思いつきました。

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

このアプリケーションは、xamlを手動で作成するよりも便利な場合がありますが、それほど頻繁ではありません。 enter image description here

42
vortexwolf

PopUpに「カスタム」配置モードを使用し、コールバックを宣言して、次に示すように、ポップアップコントロールを正しい位置に配置します。 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) } };
    }
}

これがお役に立てば幸いです

5
serge_gubenko

誰かが完全な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>      
4
Sascha Krumbein

少しハッキーですが、機能します。コンボボックスのスタイルを変更するだけです。

    <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>

ポップアップHorizo​​ntalOffsetは、PopupContent.ActualWidth-PlacementTarget.ActualWidthの値を取得する必要があります。その値を取得するために私は使用しました Charles Petzoldからのこのトリック

2
Markus Hütter