应用渲染/布局变换后,获取/计算控件的正确大小

时间:2015-11-23 10:46:13

标签: c# wpf

在我向Image应用Transform后,我试图获取Image控件的大小(宽度/高度)(Render-或Layouttransform,不重要)在这种情况下)。

我的ScrollViewer控件嵌入在InvalidateMeasure()中。我使用Layout / Rendertransform来缩放有效的图像,但ActualWidth / ActualHeight或RenderSize属性不会显示新的高度/宽度。我尝试在Image控件上调用UpdateLayout()double imageHeight = imageBox.ActualHeight; double containerHeight = (imageBox.Parent as ScrollViewer).ActualHeight; double facHeight = containerHeight / imageHeight; var scaleTransform = imageBox.LayoutTransform.Value; //imageBox.RenderTransform.Value; scaleTransform.ScalePrepend(facHeight, facHeight); MatrixTransform newTransform = new MatrixTransform(scaleTransform); imageBox.LayoutTransform = newTransform; 但没有成功。

这是我目前将图像缩放到高度的代码:

imageBox.ActualHeight

首次执行该方法时,图像将(或多或少)正确缩放。在这种情况下,我希望图像垂直完全显示,无论它的宽度如何,因此我只有一个水平滚动条(如果imageHeight> imageWidth,则根本没有滚动条。)

第二次执行时,它会再次放大,因为func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { if let cell = collectionViewOne.cellForItemAtIndexPath(indexPath) { performSegueWithIdentifier("showDeals", sender: cell) } else { // Error indexPath is not on screen: this should never happen. } } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { assert(sender as? UICollectionViewCell != nil, "sender is not a collection view") if let indexPath = self.collectionViewOne?.indexPathForCell(sender as! UICollectionViewCell) { if segue.identifier == "showDeals" { let detailVC: DealsTableViewController = segue.destinationViewController as! DealsTableViewController detailVC.someCategory = MyIds[indexPath.row] } } else { // Error sender is not a cell or cell is not in collectionView. } } 没有变化。

我尝试了InvalidateMeasure和UpdateLayout的各种组合,但这并没有帮助。

1 个答案:

答案 0 :(得分:2)

对于应用LayoutTransform(但不是RenderTransform)后的变换大小,请检查图像控件的DesiredSize属性:

double imageHeight = imageBox.DesiredSize.Height;