Модераторы: gambit, Kefir, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WPF ComboBox ширина выпадающего списка, Как изменить ширину выпадающего списка? 
:(
    Опции темы
Hobotanius
  Дата 26.9.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Здравствуйте.
Как изменить ширину выпадающего списка ComboBox'а?
У меня элементы очень длинные - некрасиво получается - выпадающий список на всю ширину экрана открывается. Нужно чтоб выпадающий список был по ширине таким же как сам комбобокс. Найти нужного свойства ширины списка не удалось... Как это сделать?
PM MAIL   Вверх
hexzo
Дата 27.9.2011, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



По такому принципу, только надо ещё придумать как забиндить относительно, к владельцу элемента а не к конкретному имени.
Код

<ComboBox Height="23" HorizontalAlignment="Left" Margin="128,58,0,0" Name="comboBox1" VerticalAlignment="Top" Width="66">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <Label Content="{Binding Path=Content}" Width="{Binding ElementName=comboBox1, Path=ActualWidth}"></Label>
                </DataTemplate>
            </ComboBox.ItemTemplate>
            <Label>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</Label>
            <Label>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</Label>
            <Label>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</Label>
            <Label>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</Label>
</ComboBox>


Добавлено @ 08:18
Вот такой магией можно забиндить относительно.
Код

<DataTemplate>
  <Label Content="{Binding Path=Content}" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}}, Path=ActualWidth}"></Label>
</DataTemplate>


Это сообщение отредактировал(а) hexzo - 27.9.2011, 08:18
PM MAIL   Вверх
Hobotanius
Дата 27.9.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Спасибо что уделили внимание.

Сделал так:
Код

                        <ComboBox Name="comboBoxRegJournal" Grid.Column="1" Height="26" Width="Auto" VerticalAlignment="Top" MinWidth="140" Margin="4" SelectionChanged="comboBoxRegJournal_SelectionChanged">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <Label Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}}, Path=ActualWidth}"></Label>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>


В классе делаю так:
Код

        // Вызов инициализации 
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            RegJournalComboBoxInit();
        }

        // Переменная - член класса
        private DataTable _dataSourceComboBoxRegJournal = new DataTable();

        // Инициализация комбобокса
        private void RegJournalComboBoxInit()
        {
            try
            {
                using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ConnectDatabaseString))
                {
                    SqlCommand command = new SqlCommand("select * from view_informationservicesnames", connection);

                    connection.Open();
                    SqlDataReader reader = command.ExecuteReader();
                    _dataSourceComboBoxRegJournal.Clear();
                    _dataSourceComboBoxRegJournal.Load(reader);
                    reader.Close();
                    connection.Close();

                    Binding bind = new Binding();
                    comboBoxRegJournal.DataContext = _dataSourceComboBoxRegJournal;
                    comboBoxRegJournal.SetBinding(ComboBox.ItemsSourceProperty, bind);
                    comboBoxRegJournal.DisplayMemberPath = "Услуга";
                    comboBoxRegJournal.SelectedIndex = -1;

                }
            }
            catch
            {
            }
        }


Результат:
user posted image

Без шаблона:
Код

<ComboBox.ItemTemplate>
<DataTemplate>
 <Label Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}}, Path=ActualWidth}"></Label>
</DataTemplate>
</ComboBox.ItemTemplate>


Результат такой:
user posted image

Почему же сбивается программный биндинг? Или что я упускаю - от чего не получается?

PM MAIL   Вверх
Gvozdin
Дата 27.9.2011, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



1. Как у вас Label что-то отображает если Label.Text не установлен?

2. Вообще надо использовать ComboBox.MaxDropDownHeight для ограничения ширины дроп дауна

3. Combobox.DisplayMemberPath мне кажется не работает в случае с шаблоном.

4. Чем отличается вариант "Без шаблона" от основного?
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Hobotanius
Дата 27.9.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Цитата(Gvozdin @  27.9.2011,  10:05 Найти цитируемый пост)
1. Как у вас Label что-то отображает если Label.Text не установлен?


Это вопрос или подсказка?

Если вопрос:
То я же создаю привязку...
Код

                    Binding bind = new Binding();
                    comboBoxRegJournal.DataContext = _dataSourceComboBoxRegJournal;
                    comboBoxRegJournal.SetBinding(ComboBox.ItemsSourceProperty, bind);
                    comboBoxRegJournal.DisplayMemberPath = "Услуга";
                    comboBoxRegJournal.SelectedIndex = -1;



Цитата(Gvozdin @  27.9.2011,  10:05 Найти цитируемый пост)
4. Чем отличается вариант "Без шаблона" от основного?


Отличается отсутствием этого кода:
Код

<ComboBox.ItemTemplate>
<DataTemplate>
 <Label Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}}, Path=ActualWidth}"></Label>
</DataTemplate>
</ComboBox.ItemTemplate>


Цитата(Gvozdin @  27.9.2011,  10:05 Найти цитируемый пост)
2. Вообще надо использовать ComboBox.MaxDropDownHeight для ограничения ширины дроп дауна


Но как это возможно? Ведь MaxDropDownHeight - возвращает или задает максимальную высоту раскрывающейся части поля со списком, а не ширину. А MaxDropDownWidth - не существует. :(

Цитата(Gvozdin @  27.9.2011,  10:05 Найти цитируемый пост)
3. Combobox.DisplayMemberPath мне кажется не работает в случае с шаблоном.

Могу предположить что слетает вся привязка к _dataSourceComboBoxRegJournal, однако тогда не понятно от чего именно две пустых строчки выпадает. Хотя... А почему именно DisplayMemberPath cлетает? 
Непонятно пока что...

PM MAIL   Вверх
hexzo
Дата 27.9.2011, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Hobotanius 
Цитата

То я же создаю привязку...

Ну так шаблон то всегда пустую метку отображает, там же нужно указать чем её заполнять.

Цитата

А MaxDropDownWidth - не существует. :(

Прикольно.  smile 
PM MAIL   Вверх
Hobotanius
Дата 27.9.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Цитата(hexzo @  27.9.2011,  11:25 Найти цитируемый пост)
Ну так шаблон то всегда пустую метку отображает, там же нужно указать чем её заполнять.

Я не понимаю как связать _dataSourceComboBoxRegJournal с Label. Ведь метка представитель элемента, а _dataSourceComboBoxRegJournal это набор элементов.

Цитата(hexzo @  27.9.2011,  11:25 Найти цитируемый пост)
Прикольно.   


Печально что не предусмотрено MaxDropDownWidth. Было бы меньше гемороя на мой взгляд. Или я ошибаюсь?

Я пробовал такой вариант - создал в БД специальную вьюшку в которую добавил поле с обрезанным наименованием услуги. И тогда выпадающий список в ширину всгда такой же как и основной комбобокс, но при ресайзе окна основной комбобокс расширяется и снова получается некрасиво. Обрезанные на полуслове строки выглядят ужасно когда есть пространство для их продолжения.
PM MAIL   Вверх
hexzo
Дата 27.9.2011, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Hobotanius 
Цитата

Ведь метка представитель элемента, а _dataSourceComboBoxRegJournal это набор элементов.

Нужно указать свойство элемента коллекции которое должна отображать метка. Я в комбо бокс запихивал прямо лейблы, и соответственно это свойство Сontent.
Код

<Label Content="{Binding Path=Content}"/>



Hobotanius
Цитата

Печально что не предусмотрено MaxDropDownWidth. Было бы меньше гемороя на мой взгляд. Или я ошибаюсь?

Ща придёт Gvozdin и всё нам объяснит.  smile 
PM MAIL   Вверх
Hobotanius
Дата 27.9.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Здорово! Огромное спасибо всё получилось.

Рабочий вариант таков:
Код

                        <ComboBox Name="comboBoxRegJournal" Grid.Column="1" Height="26" Width="Auto" VerticalAlignment="Top" MinWidth="140" Margin="4" SelectionChanged="comboBoxRegJournal_SelectionChanged">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <Label Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}}, Path=ActualWidth}" Content="{Binding Path=Услуга}" ></Label>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>  
                        </ComboBox>

Код

        private void RegJournalComboBoxInit()
        {
            try
            {
                using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ConnectDatabaseString))
                {
                    SqlCommand command = new SqlCommand("select * from view_informationservicesnames", connection);

                    connection.Open();
                    SqlDataReader reader = command.ExecuteReader();
                    _dataSourceComboBoxRegJournal.Clear();
                    _dataSourceComboBoxRegJournal.Load(reader);
                    reader.Close();
                    connection.Close();

                    Binding bind = new Binding();
                    comboBoxRegJournal.DataContext = _dataSourceComboBoxRegJournal;
                    comboBoxRegJournal.SetBinding(ComboBox.ItemsSourceProperty, bind);
                    //comboBoxRegJournal.DisplayMemberPath = "Услуга"; - используется привязка в XAML
                    comboBoxRegJournal.SelectedIndex = -1;


                }
            }
            catch
            {
            }
        }


Результат:
user posted image

На рисунке видно что выпадающий список чуть шире чем основное окно комбобокса это из-за свойства Margin у комбобокса.
Я недавно (c августа) изучаю wpf - я так понял что синтаксис привязки в XAML не допускает арифметических операций. Как же наиболее красиво описать привязку ширины как актуальный размер комбобокса минус марджин?

PM MAIL   Вверх
Gvozdin
Дата 27.9.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



C MaxDropDownHeight погорячился smile
Да как-то странно что нету MaxDropDownWidth ...
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Hobotanius
  Дата 7.10.2011, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Оказывается дело тут не в Margin!
Я переделал немного разметку и избавиля от ненулевого марджина, но результат тот же.
Вот что отображается:
user posted image

Привязка та же:
Код

                        <ComboBox Name="comboBoxRegJournal" Grid.Column="1" Height="26" Width="Auto" VerticalAlignment="Top" MinWidth="140" Margin="4" SelectionChanged="comboBoxRegJournal_SelectionChanged">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <Label Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}}, Path=ActualWidth}" Content="{Binding Path=Услуга}" ></Label>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>  
                        </ComboBox>


Почему выпадающий список больше комбобокса не понимаю. Как можно обойти то что в привязке нельзя использовать арифметику?
PM MAIL   Вверх
hexzo
Дата 7.10.2011, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(Hobotanius @  7.10.2011,  07:38 Найти цитируемый пост)
Как можно обойти то что в привязке нельзя использовать арифметику? 

Самый тупой вариант - сделать привязку к свойству с арифметикой.

PM MAIL   Вверх
Hobotanius
Дата 7.10.2011, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Цитата(hexzo @  7.10.2011,  07:58 Найти цитируемый пост)
Самый тупой вариант - сделать привязку к свойству с арифметикой.

То есть, если я правильно понял, создать ещё одно свойство и создать событие которое будет реагировать на изменение значения этого свойства. И в обработчике прибавлять или отнимать сколько нужно, а затем уже к этому свойству привязывать? Увидеть бы пример. 

Это сообщение отредактировал(а) Hobotanius - 7.10.2011, 08:18
PM MAIL   Вверх
Gvozdin
Дата 7.10.2011, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Простой конвертер можно использовать, в нем делайте что хотите
Даже мульти байндинг можно использовать, что бы вычислять на основе нескольких значений
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
Hobotanius
Дата 7.10.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Цитата(Gvozdin @  7.10.2011,  08:29 Найти цитируемый пост)
Простой конвертер можно использовать, в нем делайте что хотитеДаже мульти байндинг можно использовать, что бы вычислять на основе нескольких значений

Спасибо, щас почитаю о конверторах...

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.1082 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.