【问题标题】:Dynamically created Silverlight controls not visible动态创建的 Silverlight 控件不可见
【发布时间】:2010-10-27 06:42:26
【问题描述】:

我在 Silverlight 2 中动态添加自定义控件,但它们不可见。但是,在检查 Silverlight Spy 中的可视化树时,我注意到它们的可见性属性是可见的,将其切换到折叠并返回可见会导致控件变得可见。

我可能做错了什么?关于我应该寻找什么来解决这个问题的任何想法?

【问题讨论】:

    标签: silverlight dynamic visibility


    【解决方案1】:

    首先想到的是您使用哪种容器对象来创建动态控件(如果有的话)?

    我可以看到在不使用容器的情况下添加控件可能会给您带来一些问题。 我不能说我已经动态创建了许多控件对象,但我认为将您的项目添加到堆栈面板将是最简单的实现。

    一个好的测试用例可能是创建一个网格并在创建控件时为其分配网格位置。

    这里有一个link,关于如何做到这一点。

    【讨论】:

    • 如果我没有记错创建对象而不将它们添加到容器中,那么它们根本不会出现在可视化树中。
    【解决方案2】:

    我已经能够解决问题,该问题发生在我向时间线动态添加时间段时。

    我动态添加到画布的控件具有以下结构。

    <Path x:Name="ribbonItem" Fill="Green">
      <Path.Data>
        <GeometryGroup>
          <RectangleGeometry x:Name="ribbonItemBackground" />
        </GeometryGroup>
      </Path.Data>
    </Path>
    

    RectangleGeometry 的尺寸取决于三个输入,即时间线栏和时间线项目(我添加的内容)的日期和时间范围以及栏(画布)的尺寸。

    当设置了对象的任何 BarRange、ItemRange 或 BarSize 属性时,将调用以下方法。

    private void Resize()
    {
    if (_itemRange != null && _barRange != null && _barSize != Size.Empty)
      {
        ribbonItemBackground.Rect = ItemRectangle();
      }
    }
    

    这导致了我的问题中提到的绘图问题,解决方法是添加

    ribbonItem.InvalidateMeasure();
    

    设置ribbonItemBackground.Rect后立即。

    【讨论】:

    • 对你有好处! :) 你应该在下次提问时添加类似的信息。
    【解决方案3】:

    父控件上的 UpdateLayout() 不应该是必需的。

    但不要忘记 my_parent_control.Add(UIElement mynewcontrol);

    即my_parent_control 可以是堆栈面板。

    【讨论】:

      【解决方案4】:

      您是否尝试在要添加它们的控件上调用 UpdateLayout()?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多