none
Проблема с ComboBox в Silverlight 4 RRS feed

  • Вопрос

  • Здравствуйте!

    Столкнулся с такой проблемой. В приложении Silverlight 4 расположен ComboBox, причем достаточно близко к нижнему краю окна, но не вплотную. Все его содержимое - 3 строчки. При щелчке по списку он открывается то вверх, и тогда виден полностью, то вниз, и тогда видна только одна строчка плюс маленькие кнопочки вверх-вниз. И это приводит пользователей в некоторое смущение. Есть ли возможность как-то принудительно заставить его раскрываться только вверх?

    13 января 2011 г. 6:25

Ответы

  • Использование RenderTransform не дает желаемого результата. Сисок отображается точно так же, как он был бы отображен раньше, просто смещается по вертикали. То есть, в ряде случаев - в уменьшенном по вертикали размере.

    Но я свою задачу решил, обойдя проблему. Довольно тупой способ, но он работает. ;) При каждом событии Loaded для контрола, внутри которого размещен ComboBox, выполняется примерно следующее:

    MyCombo.Height++;
    UpdateLayout();
    MyCombo.Height--;
    UpateLayout();
    
    В результате, ComboBox "забывает", что его уже однажды открывали, и открывается как в первый раз, то есть, наверх.
    14 января 2011 г. 9:10
  • Мда, хак еще тот :)

    Таким образом, проблема заключается в том, что высота списка рассчитывается неверно, а неверное позиционирование является следствием этой проблемы. На официальном форуме Silverlight для решения этой проблемы советуют указать минимальную высоту панели для шаблона ItemsPanel, достаточную, для открывания списка вверх при любом количестве элементов.

    14 января 2011 г. 10:24

Все ответы

  • Судя по документации в MDSN и аналогичному вопросу , поможет только переопределение шаблона (ControlTemplate). Пример переопределения шаблона для ComboBox есть вот здесь .
    13 января 2011 г. 9:37
  • Спасибо, буду копать в этом направлении. Правда, тот вопрос был про WPF. Silverlight может не дать это сделать. Но буду пробовать.
    13 января 2011 г. 11:49
  • В Silverlight этот метод тоже работает, гарантирую :)
    13 января 2011 г. 19:16
  • Не работает. В Silverlight у объекта Popup нет свойства Placement. Равно как нет триггеров и нельзя в шаблоне прицепить обработку события. Вариант с RenderTransform тоже не дает нужного результата - список смещается по отношению к исходному положению, но его размеры остаются теми же, то есть, урезанными. Установка MinHeight ничего не дает.
    14 января 2011 г. 4:57
  • Прошу прощения, видимо, я не совсем точно выразился. В Silverlight работает тот же самый метод , но не тот же самый код, приведенный по ссылке выше.
    Отредактировать шаблон элемента управления ComboBox, специфичного для Silverlight, можно в Expression Blend, а вместо Placement можно самостоятельно разместить его в нужной позиции, например, так:

    <StackPanel>
      <TextBlock Text="Lorem Ipsum is simply dummy text of the printing and typesetting industry." Height="40" TextWrapping="Wrap" />
      <StackPanel>
        <Popup x:Name="popup" IsOpen="False">
          <Popup.RenderTransform>
            <TranslateTransform Y="-20" />
          </Popup.RenderTransform>
          <Border BorderBrush="Black" BorderThickness="1" Height="19" Width="100">
            <TextBlock Text="Popup" />
          </Border>
        </Popup>
        <StackPanel Orientation="Horizontal">
          <TextBox Text="text" Width="200" />
          <Button Content="button" Click="Button_Click" />
        </StackPanel>
      </StackPanel>
    </StackPanel>
    
    

    Обработчик нажатия на кнопку:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
      popup.IsOpen = true;
    }
    

    14 января 2011 г. 8:33
  • Использование RenderTransform не дает желаемого результата. Сисок отображается точно так же, как он был бы отображен раньше, просто смещается по вертикали. То есть, в ряде случаев - в уменьшенном по вертикали размере.

    Но я свою задачу решил, обойдя проблему. Довольно тупой способ, но он работает. ;) При каждом событии Loaded для контрола, внутри которого размещен ComboBox, выполняется примерно следующее:

    MyCombo.Height++;
    UpdateLayout();
    MyCombo.Height--;
    UpateLayout();
    
    В результате, ComboBox "забывает", что его уже однажды открывали, и открывается как в первый раз, то есть, наверх.
    14 января 2011 г. 9:10
  • Мда, хак еще тот :)

    Таким образом, проблема заключается в том, что высота списка рассчитывается неверно, а неверное позиционирование является следствием этой проблемы. На официальном форуме Silverlight для решения этой проблемы советуют указать минимальную высоту панели для шаблона ItemsPanel, достаточную, для открывания списка вверх при любом количестве элементов.

    14 января 2011 г. 10:24