1

制作了一个 dummyapp 来说明我在现实世界应用程序中遇到的问题:

我有一个 WPF 用户控件,内容如下:

<UserControl.DataContext>
    <local:ViewModel/>
</UserControl.DataContext>
    <StackPanel>
        <Button Content="Add to collection!" Command="{Binding AddCommand}"/>
        <ItemsControl ItemsSource="{Binding Path=Collection}"/>
    </StackPanel>

Datacontext 是这样的 ViewModel:

public class ViewModel : INotifyPropertyChanged
{
    public ObservableCollection<string> Collection { get; set; }

    public ICommand AddCommand { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public ViewModel()
    {
        Collection = new ObservableCollection<string>
        {
            "string number 1",
            "string number 2"
        };

        int counter = 3;
        AddCommand = new RelayCommand(x =>
        {
            Collection.Add($"Added string number {counter}");
            counter++;
        });
    }

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

RelayCommand 实现 ICommand。单击添加按钮时,“AddCommand”运行,并将一个项目添加到集合中,绑定到 xaml ItemsControl。我已将 UserControl 放在一个自动调整大小的 ElementHost 中,停靠在我的 Forms 应用程序中的“顶部”,如下所示:

    public Form1()
    {
        InitializeComponent();

        var elementHost = new ElementHost()
        {
            Dock = DockStyle.Top,
            AutoSize = true
        };

        elementHost.Child = new WpfUserControl();

        Controls.Add(elementHost);
    }

当我启动程序时控件显示正确 - 但我的问题是:如果我调整或最大化窗口然后按下按钮,用户控件将不会得到更新/调整大小!...直到我手动调整托管窗口的大小!因此,只有在更改托管窗口的大小后,elementhost 才会调整大小以适应新添加的内容。

试图使用一些事件来强制宿主表单在 UserControl 上更新()/更新布局()等等,但没有成功。在不同的系统上试过这个,我总是得到相同的结果。非常令人沮丧...

4

2 回答 2

0

使用 DockStyle.Fill 而不是 Top。

于 2018-04-15T20:35:13.760 回答
0

将父窗体 (System.Windows.Forms.Form) 的AutoScroll属性设置为true。它会起作用的。

于 2021-01-05T13:39:41.433 回答