WPF ComboBox Элементы в размере UserControl не обновляются - PullRequest
0 голосов
/ 23 октября 2018

У меня есть пользовательский элемент управления.Этот пользовательский элемент управления создается из кода и посредством привязки он уже получает изменения, хотя он еще не виден.В какой-то момент он становится «видимым», присваивая его содержимому ContentHolder (это вторая страница в диалоговом окне настройки):

ContentHolder.Content = GamePreparation;

В моем пользовательском элементе управления есть ComboBox, который я в настоящее время заполняю вручную:

BoxGuestColor.Items.Clear();
if( Game?.CurrentTeamGuest != null )
{
    foreach( var color in ( (TeamElement)Game.CurrentTeamGuest ).Colors )
    {
        var item = new Rectangle
        {
            Fill = new SolidColorBrush( FromHex( color ) ),
            Height = 16,
            VerticalAlignment = VerticalAlignment.Stretch,
            Tag = color
        };
        BoxGuestColor.Items.Add( item );
    }
    if( BoxGuestColor.Items.Count > 0 )
    {
        BoxGuestColor.SelectedIndex = 0;
    }
}

Как вы можете видеть из кода, я использую ComboBox для отображения нескольких цветов.Я помещаю прямоугольники в ComboBox, так как я хочу отображать только цвет и ничего больше.

Теперь все это работает хорошо!Моя проблема в том, что когда отображается элемент управления, я не вижу выбранный элемент.Только когда я нажимаю на стрелку, чтобы открыть ComboBox, запускается обновление, и я вижу все элементы (включая выбранный).

Используя отладчик, я понял, что выбранный элемент действителен, но его ширинаи height равны 0. Для элементов установлено значение Stretch as VerticalAlignment, но кажется, что обновление «не достигает» элементов.Они не масштабируются при отображении пользовательского элемента управления.Это происходит, когда я взаимодействую с ComboBox, как описано выше.

Я также пытался встроить прямоугольник в ComboBoxItem с тем же эффектом:

var item = new ComboBoxItem
{
    Height = 16,
    VerticalAlignment = VerticalAlignment.Stretch,
    Tag = color,
    Content = new Rectangle
    {
        Fill = new SolidColorBrush( FromHex( color ) ),
        Height = 16,
        VerticalAlignment = VerticalAlignment.Stretch,
        Tag = color
    }
};

Кто-нибудь знает, в чем проблемавозможно?Заранее спасибо!

Редактировать 1:

XAML прямо вперед:

<ComboBox Name="BoxGuestColor" Grid.Column="1" Margin="5" SelectionChanged="BoxGuestColor_SelectionChanged"/>

Редактировать 2:

Обратите внимание, что ComboBox имеет переменную ширину в зависимости от размера родительского окна.Использование жестко запрограммированных значений ширины (например, для прямоугольника) решает проблему обновления, но это оставляет меня с теми прямоугольниками, которые никогда не заполняют ComboBox, что просто не выглядит хорошо.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Первое, что я получил ошибку, когда использовал ваш код из-за имени элемента управления "BoxGuestColor", которого нет в текущем контексте.Поэтому я изменил его на «BoxHomeColor».Надеюсь, вы не обновляете diff.выпадающий список и проверка другого.

Во-вторых, когда я пытался с вашим кодом, изначально он не показывал мне выбранный после загрузки окна.После явного добавления Width = "100" (Некоторое случайное значение) в коде позади, он начал показывать выбранное.См. Код ниже,

      BoxHomeColor.Items.Clear(); if( Game?.CurrentTeamGuest != null ) {
      foreach( var color in ( (TeamElement)Game.CurrentTeamGuest ).Colors )
      {
          var item = new Rectangle
          {
              Fill = new SolidColorBrush( FromHex( color ) ),
              Height = 16,
              Width = 100,
              VerticalAlignment = VerticalAlignment.Stretch,
              Tag = color
          };
          BoxHomeColor.Items.Add( item );
      }
      if( BoxHomeColor.Items.Count > 0 )
      {
          BoxHomeColor.SelectedIndex = 0;
      } }

Но в вашем случае, если вы не можете жестко закодировать ширину в выделенном коде, тогда попробуйте явно установить ширину в поле со списком и назначить ширину прямоугольника изBoxHomeColor.Width, как показано ниже,

            <ComboBox Name="BoxHomeColor" Grid.Column="1" Margin="5"
            SelectionChanged="BoxHomeColor_SelectionChanged" Width="400"/>

            BoxHomeColor.Items.Clear(); if( Game?.CurrentTeamGuest != null ) {
            foreach( var color in ( (TeamElement)Game.CurrentTeamGuest ).Colors )
            {
                var item = new Rectangle
                {
                    Fill = new SolidColorBrush( FromHex( color ) ),
                    Height = 16,
                    Width = BoxHomeColor.Width,
                    VerticalAlignment = VerticalAlignment.Stretch,
                    Tag = color
                };
                BoxHomeColor.Items.Add( item );
            }
            if( BoxHomeColor.Items.Count > 0 )
            {
                BoxHomeColor.SelectedIndex = 0;
            } }

Надеюсь, что таким образом вы можете попробовать, но если вы не можете жестко закодировать ширину даже в xaml для комбинированного окна, то мы могли бы подумать, чтобы решить этокаким-то другим способом.Но дайте нам знать ваши взгляды после испытаний.

0 голосов
/ 23 октября 2018

Если вы заполните его до показа элемента управления, попробуйте обновить привязку свойства .SelectedIndex после отображения элемента управления.

Это сообщит представлению о том, что ему нужно отобразить первый элемент всписок.

...