【问题标题】:Whats the best way to resize all the elements in the silverlight canvas on resize?在调整大小时调整 silverlight 画布中所有元素的最佳方法是什么?
【发布时间】:2009-12-09 13:19:24
【问题描述】:

我刚开始学习 SL。我试图在调整大小时调整画布内所有元素的大小。但我找不到正确的方法。

这就是我所做的

  1. 遍历画布中的所有子元素
  2. 根据新尺寸计算比例 X 和 Y
  3. 并将比例值与每个元素的大小属性相乘

但在 SL3.0 中,我在 UIelement 中找不到任何尺寸属性来设置新尺寸。示例代码下方

    private void testCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        var scaleX = e.NewSize.Width / e.PreviousSize.Width;
        var scaleY = e.NewSize.Height / e.PreviousSize.Height;

        for (int i = 0; i < testCanvas.Children.Count; i++)
        {
            UIElement ui = testCanvas.Children[i];
            // but no ui.width or ui.height
        }
    }

我也无法找到一个选项来将每个元素移动到相对于尺寸改变的画布的新位置......

谁能给我指出正确的方向..

更新:

我想在MSCUI 中实现这样的目标。为了更清楚,我添加了一些屏幕截图

这是初始屏幕的外观。 alt text http://img690.imageshack.us/img690/4611/initial.jpg

在扩展小部件时,它会放大,而其他小部件会缩小

alt text http://img26.imageshack.us/img26/8725/afterexpand.jpg

我只需要做缩放部分。有什么想法吗??

【问题讨论】:

  • 您想要的真实布局特征的细节有点粗略,您可以考虑在问题中添加更多细节。例如,画布是否包含可滚动的文本项?如果是这样,这些项目应该简单地显示更多文本还是应该增加文本的大小?您希望项目与画布边界的距离增加还是保持不变并且项目区域仅增长?
  • @Anthony,添加了更多信息,请查看..

标签: c# silverlight silverlight-3.0 transform


【解决方案1】:

MSCUI 演示由 Martin grayson 构建,他在此处发布了他的 Drag Dock 控件:http://mightymeaty.members.winisp.net/blacklight.silverlight/(现在 Telerik 和 Infragistics 还提供了一些其他 TileView 控件,它们也执行相同的酷布局功能)。但是默认情况下,这不支持自动调整内容大小。

幸运的是,2009 年 11 月的工具包中有一个新控件:ViewBox,它可以用最少的代码完成您需要的工作。

http://silverlight.net/content/samples/sl3/toolkitcontrolsamples/run/default.html 有一个演示。 ViewBox 演示位于左侧菜单的底部。

工具包可以从http://silverlight.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=36060下载

【讨论】:

    【解决方案2】:

    与其自己调整元素的大小,不如将它们放在一个网格中,让元素的大小与单元格的大小相关(即在元素上设置边距)。调整网格大小时,会移动元素并调整其大小。

    【讨论】:

    • 谢谢 Guffa.. 但问题是设计的控件不是有序的(不像行、列).. 很难将它们排列在网格中.. 无论如何我会尝试的。 ..
    • @Ramesh:是的,我明白这一点,因为这是您的评论和否决之间的一天。这个问题是针对任何人的......
    【解决方案3】:

    使用 GetLeft()、GetRight()、GetTop() 和 GetBottom() 方法传递子 UIElement。

    private void testCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        var scaleX = e.NewSize.Width / e.PreviousSize.Width;
        var scaleY = e.NewSize.Height / e.PreviousSize.Height;
    
        for (int i = 0; i < testCanvas.Children.Count; i++)
        {
            UIElement ui = testCanvas.Children[i];
    
            double left = Canvas.GetLeft(ui);
            double top = Canvas.GetTop(ui);
            double right = Canvas.GetRight(ui);
            double bottom = Canvas.GetBottom(ui);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2021-11-27
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多