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 可序列化等)。
我一直在尝试通过 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 可序列化等)。