Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF缩放的不同方法:访问DesignProperties?_C#_Wpf - Fatal编程技术网

C# WPF缩放的不同方法:访问DesignProperties?

C# WPF缩放的不同方法:访问DesignProperties?,c#,wpf,C#,Wpf,所以我似乎不理解WPF中的伸缩性,或者所有的解决方案都过于复杂。背景是,我必须缩放父用户控件及其子控件,同时尽量避免使用过于智能的XAML。因此,我尝试使用一种不同的(更容易的?)方法来扩展WPF 首先,我订阅SizeChanged事件。根据新的和以前的大小(均由事件参数提供),我计算宽度和高度的比率,并将它们应用于每个子元素,从而调整它们的大小。听起来很简单。但是,当实际生成UserControl时,SizeChanged事件将第一次触发。此时,“旧”高度和宽度均为0(或分别为NaN) 以下是

所以我似乎不理解WPF中的伸缩性,或者所有的解决方案都过于复杂。背景是,我必须缩放父用户控件及其子控件,同时尽量避免使用过于智能的XAML。因此,我尝试使用一种不同的(更容易的?)方法来扩展WPF

首先,我订阅SizeChanged事件。根据新的和以前的大小(均由事件参数提供),我计算宽度和高度的比率,并将它们应用于每个子元素,从而调整它们的大小。听起来很简单。但是,当实际生成UserControl时,SizeChanged事件将第一次触发。此时,“旧”高度和宽度均为0(或分别为NaN)

以下是我目前的做法(简化;忽略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;
    }