WPF扩展的不同方法:访问DesignProperties?

时间:2012-01-09 17:51:43

标签: c# wpf

所以我似乎不理解WPF中的缩放或者所有解决方案都过于复杂。背景是,我必须扩展父UserControl及其子项,同时试图避免对我来说太聪明的XAML。所以我试图采用不同的(更容易?)方法来扩展WPF。

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

这是我现在的处理方式(简化;忽略了NaN的问题):

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

我想通过在设计时将UserControl的大小更改为不存在的“旧”大小来处理第一个被触发的事件。我可能错了,但是XAML暗示了一个名为DesignProperties.DesignWidth的静态属性(XAML:例如d:DesignWidth =“300”)。我可以以某种方式访问​​这个?如果没有,是否有一种替代方法以编程方式解决问题(或一般缩放)?提前谢谢。

3 个答案:

答案 0 :(得分:1)

d:DesignWidth / Height属性仅供设计时使用,在运行时无法访问。

我不确定您问题的最佳方法,但您可能会发现ActualWidth / ActualHeight属性很有用。或者你可能根本不需要使用适当的容器和大小调整(例如*大小的网格单元格,DockPanel.LastChildFill = true等) - WPF可以为你做很多事情。对于位图图像或临时大小更改等内容,显式缩放更多。

答案 1 :(得分:1)

如果我理解正确,您希望在可用空间发生变化时,在某个用户控件(容器)中为多个项目确定合适的大小和位置。通常只需选择合适的布局面板即StackPanel,WrapPanel,DockPanel,Grid,Canvas ......

如果没有标准实现满足您的需求,您可以通过实现'ArrangeOverride'和'MeasureOverride'(Tutorial here)函数来创建自己的布局面板。然后您的UserControl可以使用此布局面板。 WPF倾向于刺激使用“复合控件”,即你应该在ControlTemplate或Xaml中使用你的CustomPanel(不用担心,它想成为你的朋友)你的UserControl,而不是从CustomPanel派生UserControl。

答案 2 :(得分:1)

如果您只想按比例调整内容大小,可能需要尝试使用ViewBox: http://wpftutorial.net/ViewBox.html