我一直试图通过AppDomain边界传递UserControl,并注意到FrameworkElementAdapters.ViewToContractAdapter()
和ContractToViewAdapter()
的奇怪行为。使用INativeHandleContract
将FrameworkElement
转换回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案例中的问题基本相同,但似乎没有解决方案。有没有人知道如何摆脱这个?
提前致谢!
答案 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;
};
}
}
不能序列化等。)。