WPF UI 加载项未更新其大小

WPF UI AddIn not updating its size

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

可以使用简单的空 WPF 轻松演示此行为 window:

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 案例中的问题基本相同,但似乎没有解决方案。有谁知道如何摆脱这个?

提前致谢!

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

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;
        };            
    }
}

在我的例子中,我不得不做一些魔术来让事件通过 AppDomain 边界(例如 SizeChangedEventArgs 不是 beeing 可序列化等)。