WPF UI AddIn不更新其大小

时间:2017-06-07 16:18:32

标签: c# wpf add-in

我一直试图通过AppDomain边界传递UserControl,并注意到FrameworkElementAdapters.ViewToContractAdapter()ContractToViewAdapter()的奇怪行为。使用INativeHandleContractFrameworkElement转换回FrameworkElementAdapters.ContractToViewAdapters()后,如果其中一个子项增长,则包装的UserControl不会再更改其大小。

使用简单的空WPF窗口可以很容易地演示此行为:

public partial class MainWindow : Window
{
    private ListBox listBox;
    private Button myButton;

    public MainWindow()
    {
        InitializeComponent();

        listBox = new ListBox();
        Content = listBox;

        myButton = new Button { Content = "Click me" };
        myButton.Click += (sender, args) => myButton.Content = "Lorem ipsum dolor sit amet.";
        myButton.SizeChanged += (sender, args) => Debug.WriteLine($"{myButton.DesiredSize}");
        //listBox.Items.Add(myButton);

        var frameworkElement = FrameworkElementAdapters.ContractToViewAdapter(FrameworkElementAdapters.ViewToContractAdapter(myButton));
        listBox.Items.Add(frameworkElement);
    }
}

如果单击该按钮,文本将按预期更改。但是,按钮不会自行调整大小,这会留下截断的文本。如果您注释掉最后两行并只添加按钮,它将按预期工作。

我认为它与this案例中的问题基本相同,但似乎没有解决方案。有没有人知道如何摆脱这个?

提前致谢!

1 个答案:

答案 0 :(得分:0)

正如我在评论中所提到的,另外将所有内容包装在Grid中似乎可以解决这个问题,或者至少可以让您收到一个SizeChanged事件,然后您可以使用该事件来调整结果{ {1}}。

FrameworkElement

在我的情况下,我必须做一些魔术让事件通过AppDomain边界(例如public partial class MainWindow : Window { private ListBox listBox; private Button myButton; private Grid dummyGrid; public MainWindow() { InitializeComponent(); listBox = new ListBox(); Content = listBox; myButton = new Button { Content = "Click me" }; myButton.Click += (sender, args) => { myButton.Content = "Lorem ipsum dolor sit amet."; myButton.FontSize = 24; }; dummyGrid = new Grid(); dummyGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); dummyGrid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); dummyGrid.Children.Add(myButton); var frameworkElement = FrameworkElementAdapters.ContractToViewAdapter( FrameworkElementAdapters.ViewToContractAdapter(dummyGrid)); listBox.Items.Add(frameworkElement); // Automatically adjust HwndHost's size when the grid changes dummyGrid.SizeChanged += (sender, args) => { frameworkElement.Width = args.NewSize.Width; frameworkElement.Height = args.NewSize.Height; }; } } 不能序列化等。)。