Udostępnij za pośrednictwem


Win8 のコンボボックス

#win8dev_jp

Win8 の Combobox ってこういう表示になるんですよね。選択されているものがセンターに来るようにリストの位置が調整されます。

image image

多分、誤ってダブルタップしてしまった時に選択アイテムが変わらないようにするため。でも、デザイン上困る時はあります。最優先すべきはデザインなのでここはどうにかしないといけません。

でも、いろいろ触ってもリストの表示位置を管理する場所がうまく見つからない。

苦肉の策

そんなわけで苦肉の策。要は毎回「選択していない」状態にしてしまえばOK。ということでそんな処理。ただ、もし何も選択しなかった場合は元に戻さないといけないので、いったん保存と戻す処理を入れています。

private int previous_selection = -1;

private void mycombo_DropDownOpened(object sender, object e)
{
    previous_selection = mycombo.SelectedIndex;
    mycombo.SelectedIndex = -1;
}

private void mycombo_DropDownClosed(object sender, object e)
{
    if (mycombo.SelectedIndex == -1)
        mycombo.SelectedIndex = previous_selection;
}

image ← こちらはリストの表示位置をスタイルで変更しています。

ちなみに、もしこの Combobox の選択したものと、他の項目(ここでは Tilte という TextBlock )をバインドしていた場合、選択解除すると、バインド先の内容が消えてしまいます。ですので、選択解除前にバインドを外し、戻す時にはもう一度バインドを再設定するという荒業をしています。

private int previous_selection = -1;

private void mycombo_DropDownOpened(object sender, object e)
{
    Title.Text = Title.Text;
    previous_selection = mycombo.SelectedIndex;
mycombo.SelectedIndex = -1;
}

private void mycombo_DropDownClosed(object sender, object e)
{
if (mycombo.SelectedIndex == -1)
mycombo.SelectedIndex = previous_selection;
    Title.SetBinding(TextBlock.TextProperty, new Binding() { Source = mycombo.SelectedItem, Path = new PropertyPath("Content") });
}

 

まっとうなコーディングで、Title.Text = Title.Text; って書くのは結構珍しいかも。 それから、データバインディングをC#でやるのも少ないかもね。