WPF ComboBox项目中的UserControl大小未更新

时间:2018-10-23 13:46:18

标签: c# wpf combobox user-controls

我有一个用户控件。此用户控件是通过代码创建的,并且通过绑定,尽管尚不可见,但已经接受了更改。通过将其分配给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中,因为我只想显示一种颜色而已。

现在一切正常!我的问题是显示控件时,我看不到所选元素。仅当我单击箭头以打开组合框时,才会触发更新,并且我可以看到所有元素(包括所选元素)。

使用调试器,我发现所选项目是有效的,但其宽度和高度均为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:

请注意,组合框的宽度取决于父窗口的大小。使用硬编码的宽度(例如在Rectangle上)可以解决更新问题,但是,这些矩形却永远无法填充ComboBox,这看起来简直不好。

2 个答案:

答案 0 :(得分:0)

如果在显示控件之前将其填充,请在显示控件后尝试更新.SelectedIndex属性的绑定。

这将通知视图它需要显示列表中的第一项。

答案 1 :(得分:0)

由于使用控件名称“ BoxGuestColor”(当前上下文中不存在),我在使用您的代码时首先遇到了错误。所以我将其更改为“ BoxHomeColor”。希望您不更新差异。组合框并选中另一个。

第二件事,当我尝试使用您的代码时,最初没有在加载窗口后向我显示选定的代码。在后面的代码中显式添加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;
            } }

希望这种方法可以尝试一下,但是如果即使对于xbox组合框也无法对宽度进行硬编码,那么我们可能会考虑采用其他方法来解决。但是,经过试验,请告诉我们您的意见。