Soru & Cevap

Autocompletebox Auto select

22.11.2013 - 03:21

Merhabalar,

AutoCompleteBox için tanımlanmış bir listem var. Listenin içerisinde "aba", "abacı" gibi iki kelime var. AutoCompleteBox'a abacı yazmak istiyorum ancak aba yazdığımda herhangi bir seçim yapmadığım halde selectionchanged event i tetikleniyor. Yani box içerisindeki kelimelerden biri listtekilerden biriyle eşleştiği an selectionchanged eventi tetikleniyor. Bu yüzden biri diğerini içeren istediğim hiç bir kelimeyi seçemiyorum.

Garip olansa aynı kontrolü farklı bir projede kullandığımda böyle bir sorunun olmaması, yeni projelerle deniyorum ve aynı sorunla yine karşılaşıyorum. Çözümüyle, ya da sorunla ilgili hiç bir dökümana ulaşamadım, öneride bulunabilecek olan var mı ?

Yardımcı olmak isteyenler için örnek çalışan ve çalışmayan projeleri de paylaşabilirim buradan.

22 Görüntülenme

4 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-9010-1401353646.jpg
alpercem70
22.11.2013 - 12:30

Çözüm: UpdateTextCompletion methodundaki else ifadesini kaldırmak. Ancak bu da SelectionChanged ifadesinin iki kez üst üste çağrılmasına sebep oluyor, bunu çözmek içinse ilk işlem yapıldığında bir boolean değer false yapılıp ikinci kez çağrılması engellenebilir.

Yardımlarınız için çok teşekkür ederim Mehmet Bey!

picture-472-1375079047.jpg
mehmet.altiparmak
22.11.2013 - 12:07

Merhaba Alper,

Evet Tap eventi kontrolün herhangi bir yerine tıklanınca fire ediliyor. Sıradan bir kullanıcıyı düşününce yazarken kontrol üzerinde bir yere tıklamaktaki amacı yüksek olasılıkla listeden seçim yapmak olacağı için belki kabul edilebilirdi ama tam çözüm aradığın için seni kutluyorum :) 

AutoCompleteBox'ın kodunu modifiye edip kendi projende o şekilde kullanabilirsin ancak lisans kurallarına dikkat etmelisin bunu yaparken. MS-PL lisansı kullanılmış benim anladığım kadarıyla uygulamanda bir yerde bu lisansı belirtmen gerekiyor. Sen detaylıca incelersin. 

Sourcecode'u buradan indirebilirsin. Değişiklik yapman gereken yer incelediğim kadarıyla AutoCompleteBox.cs içerisindeki UpdateTextCompletion methodu. Method içerisindeki else bloğundaki ifadeyi commentlersen olacak gibi duruyor :) Method private olduğu için inherit edip override edemiyorsun ne yazık ki. 

 

picture-9010-1401353646.jpg
alpercem70
22.11.2013 - 11:36

Mehmet Bey merhabalar,

AutoCompleteBox'ın içerisindeki bütün event ler ile bu sorunu çözmeye çalıştım. Ancak sizin açıkladığınız design decision ını değiştirip custom bir kontrol yazmadan bunu çözmek mümkün görünmüyor.

Tap event'i ise herhangi bir listitem seçildiğinde değil autocompletebox ın üzerine tıklanınca çalıştığı için bu şekilde bir çözüme ulaşamadım. Bu ayrıntılı cevabınızdan ötürü ayrıca teşekkür ederim. Bu konuda sonuca ulaşabilirsek Windows Phone için ilk offline türkçe->ingilizce sözlüğü yayınlama şansım olacak.

Aynı selection etkisini herhangi bir ekstra buton koymadan sağlamakla ilgili bir fikriniz ya da tecrübeniz varsa, deneyip öğrenmekten ayrıca mutluluk duyarım.

 

picture-472-1375079047.jpg
mehmet.altiparmak
22.11.2013 - 09:55

Merhaba Alper,

Açıkçası neden böyle bir özellik eklemişler ben de anlamadım, eskiden maintain edildiği sayfada bu konu ile ilgili bir issue buldum ancak yeni versionda da bu şekilde korunmuş ve bir design change olduğu belirtilmiş kod içerisinde. 

https://silverlight.codeplex.com/workitem/9558 

                    // Perform an exact string lookup for the text. This is a 
                    // design change from the original Toolkit release when the 
                    // IsTextCompletionEnabled property behaved just like the 
                    // WPF ComboBox's IsTextSearchEnabled property.
                    //
                    // This change provides the behavior that most people expect
                    // to find: a lookup for the value is always performed.

 

Alternatif olarak şu şekilde bir yöntem belirtilmiş, Tap eventinde senin tanımladığın bool tipinde bir değişkenin değerini true set ediyorsun. SelectionChanged event handler'ın içerisinde de bu değerin doğru mu yanlış olduğunu kontrol ederek işlem yapıyorsun. 100% bir çözüm değil ancak kabul edilebilir diye düşünüyorum. 

public MainPage()
        {
            InitializeComponent();
            AutoComplete.SelectionChanged += AutoComplete_SelectionChanged;
            AutoComplete.Tap += AutoComplete_Tap;
        }

        private bool _userSelected;
        void AutoComplete_Tap(object sender, System.Windows.Input.GestureEventArgs e)
        {
            _userSelected = true;
        }

        void AutoComplete_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (_userSelected)
            {
                _userSelected = false;

            }
        }

        private readonly List<string> _dataSource = new List<string>() { "item1", "item12" };

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            AutoComplete.ItemsSource = _dataSource;
        }