C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: WPFのコンボボックスがタッチアップに反応しない時がある


(過去ログ 164 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■94784 / inTopicNo.1)  WPFのコンボボックスがタッチアップに反応しない時がある
  
□投稿者/ simano (1回)-(2020/05/18(Mon) 18:47:15)

分類:[C#] 

こんにちは。

C# WPF でタッチパネル向けのアプリを作成しています。(.Net Framework4.5, Windows10)

コンボボックスのItemやドロップダウンの高さを、下記のように、タッチしやすいサイズに変更しました。

しかし、何度かコンボボックスのItemをタッチして選択していると、タッチアップに反応しなくなり、
ドロップダウンが開いたままになることがあります(頻度は10回に1回ぐらい)。

MaxDropDownHeightを指定せずに、ドロップダウンをスクロールすると、この現象は発生しなくなるようです。
また、Itemをマウスでクリックすると、発生しません。

原因がわからずに苦慮しております。
原因か、回避方法があれば、ご指摘をお願いできないでしょうか。

-----
        <ComboBox Grid.Column="7" Grid.Row="0" Name="combo" Width="150"  Height="60" MaxDropDownHeight="500" >
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <Label Width="60" Height="60" Padding="6" Content="{Binding Number}"  />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
-----
    public partial class MainWindow : Window
    {
        private List<ComboNumberItem> _lstItem = new List<ComboNumberItem>();

        public MainWindow()
        {
            InitializeComponent();
        }

        private class ComboNumberItem
        {
            private int _num;
            public ComboNumberItem(int num)
            {
                _num = num;
            }

            public int Number { get { return _num; } }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            combo.ItemsSource = _lstItem;
            for (int i = 0; i < 5; i++)
            {
                _lstItem.Add(new ComboNumberItem(i + 1));
            
            }

            // Items.Refreshを実行しないとドロップダウンの高さが変わらない。
            combo.Items.Refresh();
        }
    }


引用返信 編集キー/
■95013 / inTopicNo.2)  Re[1]: WPFのコンボボックスがタッチアップに反応しない時がある
□投稿者/ simano (2回)-(2020/06/11(Thu) 17:34:15)
マウス使用時には発生せず、タッチ時には発生することから、ライブラリレベルの不具合かも?と考えました。
また、この問題が発生する時、PreviewMouseUpイベントは発生せずに、PreviewStylusUpイベントだけが発生することを確認しました。

このため、対処療法的ですが、下記の方法で解決としました。

コンボボックス内のDataTemplateに定義したLabelのPreviewStylusUpイベントを補足して、
内部的にコンボボックスのアイテムを選択します。

---
    private void Label_PreviewStylusUp(object sender, StylusEventArgs e)
        {
      // コンボボックス内のDataTemplateに定義したLabelのPreviewStylusUpイベントを補足する。
            // 内部的にコンボボックスを選択する。
            SelectComboBoxLabel(combo, (DependencyObject)e.OriginalSource);
        }

        private static void SelectComboBoxLabel(ComboBox combo, DependencyObject dep)
        {
            while ((dep != null) && !(dep is Label))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }
            if (dep == null) return;

            if (dep is Label)
            {
                Label lbl = dep as Label;
                lbl.Focus();

                combo.SelectedItem = lbl.DataContext;
            }

      // 開いたコンボボックスを閉じる。
            CloseComboBox(combo);
        }

        private static void CloseComboBox(ComboBox combo)
        {
            if (combo.IsDropDownOpen)
            {
                combo.IsDropDownOpen = false;
                var binding = combo.GetBindingExpression(ComboBox.SelectedItemProperty);

                if (binding != null)
                {
                    binding.UpdateSource();
                    binding.UpdateTarget();
                }
            }
        }


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -