C# WPF缩放的不同方法:访问DesignProperties?
所以我似乎不理解WPF中的伸缩性,或者所有的解决方案都过于复杂。背景是,我必须缩放父用户控件及其子控件,同时尽量避免使用过于智能的XAML。因此,我尝试使用一种不同的(更容易的?)方法来扩展WPF 首先,我订阅SizeChanged事件。根据新的和以前的大小(均由事件参数提供),我计算宽度和高度的比率,并将它们应用于每个子元素,从而调整它们的大小。听起来很简单。但是,当实际生成UserControl时,SizeChanged事件将第一次触发。此时,“旧”高度和宽度均为0(或分别为NaN) 以下是我目前的做法(简化;忽略NaN的问题):C# WPF缩放的不同方法:访问DesignProperties?,c#,wpf,C#,Wpf,所以我似乎不理解WPF中的伸缩性,或者所有的解决方案都过于复杂。背景是,我必须缩放父用户控件及其子控件,同时尽量避免使用过于智能的XAML。因此,我尝试使用一种不同的(更容易的?)方法来扩展WPF 首先,我订阅SizeChanged事件。根据新的和以前的大小(均由事件参数提供),我计算宽度和高度的比率,并将它们应用于每个子元素,从而调整它们的大小。听起来很简单。但是,当实际生成UserControl时,SizeChanged事件将第一次触发。此时,“旧”高度和宽度均为0(或分别为NaN) 以下是
我希望通过将不存在的“old”大小更改为UserControl的大小来处理第一个触发的事件,正如设计时所预期的那样。我可能错了,但XAML提示了一个名为DesignProperties.DesignWidth(XAML:e.g.d:DesignWidth=“300”)的静态属性。我能找到这个吗?如果没有,是否有其他方法以编程方式解决问题(或一般的扩展)?提前感谢。d:DesignWidth/Height属性仅供设计时使用,在运行时不可访问
我不确定解决您的问题的最佳方法,但您可能会发现ActualWidth/ActualHeight属性很有用。或者,通过使用适当的容器和大小调整(例如,大小为*的网格单元、DockPanel.LastChildFill=true等),您完全不需要使用缩放功能—WPF可以为您做很多这方面的工作。显式缩放更多用于位图图像或临时大小更改。d:DesignWidth/Height属性仅用于设计时,在运行时不可访问
我不确定解决您的问题的最佳方法,但您可能会发现ActualWidth/ActualHeight属性很有用。或者,通过使用适当的容器和大小调整(例如,大小为*的网格单元、DockPanel.LastChildFill=true等),您完全不需要使用缩放功能—WPF可以为您做很多这方面的工作。显式缩放更多用于位图图像或临时大小更改。如果我理解正确,您希望在可用空间发生变化时,为某些usercontrol(容器)中的多个项目确定合适的大小和位置。通常只需选择一个合适的布局面板,即StackPanel、WrapPanel、DockPanel、Grid、Canvas
如果没有标准实现满足您的需要,您可以通过实现函数“ArrangeOverride”和“MeasureOverride”来创建自己的布局面板。然后用户控件可以使用此布局面板。WPF倾向于鼓励使用“复合控件”,也就是说,与从CustomPanel派生UserControl相比,您更应该在ControlTemplate或UserControl的Xaml(不用担心,它希望成为您的朋友)中使用CustomPanel。如果我理解正确,当可用空间发生变化时,您希望为某些usercontrol(容器)中的多个项目确定合适的大小和位置。通常只需选择一个合适的布局面板,即StackPanel、WrapPanel、DockPanel、Grid、Canvas
如果没有标准实现满足您的需要,您可以通过实现函数“ArrangeOverride”和“MeasureOverride”来创建自己的布局面板。然后用户控件可以使用此布局面板。WPF倾向于鼓励使用“复合控件”,也就是说,与从CustomPanel派生UserControl相比,您更应该在ControlTemplate或UserControl的Xaml(毫无疑问,它希望成为您的朋友)中使用CustomPanel。如果您只想按比例调整内容大小,您可以尝试一下ViewBox:
如果您只想按比例调整内容大小,您可以尝试一下ViewBox:
是否确实要缩放(即增大/减小字体大小等)或仅调整控件的大小?缩放-用户控件的子控件。是否确实要缩放(即增大/减小字体大小等)或仅调整控件的大小?缩放-用户控件的子控件。谢谢您的建议。我希望ActualWidth/ActualHeight与WinForms的大小类似。不幸的是,在创建控件时,两者都返回0。似乎没有可能得到那些设计师的价值观。谢谢你的建议。我希望ActualWidth/ActualHeight与WinForms的大小类似。不幸的是,在创建控件时,两者都返回0。似乎不可能得到那些设计师的价值观。谢谢你的提示和好话。我尝试了本教程,但再一次,我无法相信像缩放这样简单的任务需要这么多代码和工作。无论如何,谢谢你。也许我会再试一次。谢谢你的提示和好话。我尝试了本教程,但再一次,我无法相信像缩放这样简单的任务需要这么多代码和工作。无论如何,谢谢你。也许我会再试一次。有趣的是,我就是这样解决的。我把太多的精力放在程序方法上了。这是个错误!我假设您可以像使用WinForms一样轻松地访问和更改属性。很遗憾,您不能(例如DesignProperties)。因此,我通过将WPF控件放入一个网格(我将其放入一个ViewBox)来实现比例缩放。成功了。非常感谢。有趣的是,我就是这样解决的。我把太多的精力放在程序方法上了。这是个错误!我假设您可以像使用WinForms一样轻松地访问和更改属性。很遗憾,您不能(例如DesignProperties)。因此,我通过将WPF控件放入一个网格(我将其放入一个ViewBox)来实现比例缩放。成功了。非常感谢。
private void ScaleElement(FrameworkElement element,
double previousWidth, double previousHeight,
double newWidth, double newHeight)
{
double scalingFactorX;
double scalingFactorY;
scalingFactorX = newWidth / previousWidth;
scalingFactorY = newHeight / previousHeight;
double elementRelativePosX = element.Margin.Left / previousWidth;
double elementRelativePosY = element.Margin.Top / previousHeight;
element.Margin = new Thickness(newWidth * elementRelativePosX, newHeight * elementRelativePosY, 0, 0);
element.Width *= scalingFactorX;
element.Height *= scalingFactorY;
}