【问题标题】:Dynamically added controls not displaying in wpf page动态添加的控件未显示在 wpf 页面中
【发布时间】:2020-12-31 22:51:30
【问题描述】:

我正在尝试使用 WPF 构建 Revit 插件,并且正在尝试向窗口动态添加控件。但是,这些控件没有显示在窗口中,也没有错误。任何帮助,将不胜感激。谢谢。

Xaml

    <ScrollViewer Margin="0,190,-0.4,-1">
        <StackPanel Name="TaskList" Height="auto" Width="auto">
        </StackPanel>
    </ScrollViewer>

c#

    for (var i = 0; i < dt.Rows.Count; i++)
    {
        Canvas canvas = new Canvas();
        canvas.Height = 100;
        canvas.Width = 300;
        canvas.Background = new SolidColorBrush(Colors.Black);
        canvas.Margin = new Thickness(20);

        System.Windows.Controls.TextBox tb = new System.Windows.Controls.TextBox();
        tb.Background = new SolidColorBrush(Colors.Black);
        tb.Foreground = new SolidColorBrush(Colors.White);
        tb.Width = 300;
        tb.FontSize = 30;
        tb.Height = 100;
        tb.TextWrapping = TextWrapping.Wrap;
        tb.MaxLength = 40;
        tb.Text = dt.Rows[i][2].ToString();

        canvas.Children.Add(tb);
        TaskList.Children.Add(canvas);
        TaskList.UpdateLayout();
    }

编辑 我使用页面标签作为基础而不是窗口。也许这会改变我应该如何解决这个问题?

【问题讨论】:

  • 这里为其他人提出的所有答案在我看来都是很好的解决方案,但很奇怪你还没有得到任何显示结果。您能否尝试 1) 删除任何 ScrollViewer 保证金。 2) 调试您的for 循环,以确保您在其中按预期循环。

标签: c# wpf xaml revit-api


【解决方案1】:

完全删除Canvas。您可以将TextBox 元素直接添加到StackPanel (TaskList)。如果你想要一个边框或间距,那么你应该使用Border 控件,而不是Canvas

此外,只有在您向其添加所有控件之后调用UpdateLayout()

using System.Windows.Controls;

...

    for (var i = 0; i < dt.Rows.Count; i++)
    {
        TextBox tb = new TextBox();
        tb.Background   = new SolidColorBrush( Colors.Black );
        tb.Foreground   = new SolidColorBrush( Colors.White );
        tb.Width        = 300;
        tb.FontSize     =  30;
        tb.Height       = 100;
        tb.TextWrapping = TextWrapping.Wrap;
        tb.MaxLength    =  40;
        tb.Text         = dt.Rows[i][2].ToString();

        this.TaskList.Children.Add( tb );
    }

    this.TaskList.UpdateLayout();

【讨论】:

  • 感谢您的及时回复。我试过你的方法,但不幸的是,控件仍然没有显示在窗口中。还有其他想法吗?
【解决方案2】:

考虑使用 ItemsControl,而不是在后面的代码中创建 UI 元素:

<ScrollViewer>
    <ItemsControl x:Name="TaskList">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Width="300" Height="100" FontSize="30"
                           TextWrapping="Wrap" Text="{Binding}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ScrollViewer>

然后只需将字符串添加到它的 Items 属性:

for (var i = 0; i < dt.Rows.Count; i++)
{
    TaskList.Items.Add(dt.Rows[i][2].ToString());
}

【讨论】:

  • 感谢您的回复。我尝试过这种方式,但不幸的是,控件仍然没有显示出来。还有其他想法吗?
  • 您的问题不够详细。您是否调试了代码以查看是否有任何行?
  • 是的,我做到了。 dt 中有三行。 for 循环按预期移动。代码控制在添加时没有任何问题,但由于某些未知原因,这些项目没有显示。没有显示错误。请让我知道您还需要什么信息,我很乐意提供。
  • 是否有任何显示?如果您设置 ScrollViewer 的背景,例如到红?如果您根本不使用 ScrollViewer 怎么办? ScrollViewer 的 Margin 背后的原因是什么?不应该有一个适当的布局而不是大的边距吗?
  • 显示窗口中的所有控件。只有我通过代码添加的控件没有显示。这可能是 Revit API 的问题吗?我正在使用 IDockablePaneProvider 接口来创建可停靠窗口。这会对动态控件造成任何问题吗?我有点需要滚动查看器,因为堆栈面板中可以有 n 个文本框。 scrollviewer 有一个 mrgin,因为我不希望整个窗口只能滚动其中的一部分。所以scrollviewer被放置在页面的下半部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多