非標準のドロップダウン配置でComboBox
を作成しようとしています。基本的に、ドロップダウンをComboBox
の下に配置しますが、左端ではなくComboBox
の右端に揃えます。
PlacementMode="Bottom"
を使用した、通常のComboBox
の外観:
私が欲しいもの:
ComboBox
のテンプレートでPopup.PlacementMode
プロパティを試してみましたが、可能な値のどれも私が望むことをしていないようです。できれば純粋なXAMLでそれを行う簡単な方法はありますか?
Expression Blendを開いたとき、数秒以内に解決策を思いつきました。
<Popup Placement="Left" VerticalOffset="{TemplateBinding ActualHeight}"
HorizontalOffset="{TemplateBinding ActualWidth}"
このアプリケーションは、xamlを手動で作成するよりも便利な場合がありますが、それほど頻繁ではありません。
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) } };
}
}
これがお役に立てば幸いです
誰かが完全な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>
少しハッキーですが、機能します。コンボボックスのスタイルを変更するだけです。
<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>
ポップアップHorizontalOffsetは、PopupContent.ActualWidth-PlacementTarget.ActualWidthの値を取得する必要があります。その値を取得するために私は使用しました Charles Petzoldからのこのトリック 。