UWP控件高度设为自动时获取其高度
想要实现的东西
——————————————————————————————————
- 在一个大panel里面有俩个StackPanel,布局为垂直,上面的panel里面放入一个高度自动的TextBlock,下面则是一个高度自动的输入文本框TextBox,垂直居中。
- 当下面文本框输入文字时其高度自动变化,同时用回车键把这段文字赋值给上面的textblock,我呢希望上面的panel包裹着这里面的textblock一同向上移动,使得底部与下面的panel始终相切。
遇到的问题
——————————————————————————————————
- 要移动上面的panel可以通过动态修改其margin来改变其位置,而其margin里面的Top值 = 大panel.Height - 上panel.Height - 下panel.Height - 下panel.Margin.Bottom;
- 大panel与下panel都是xaml里面设置的,而上panel是在下panel的回车键事件创建的,所以当上panel高度为自动高度时,上面的margin计算中获取到的上panel.Height值为NaN,也就无法得到上panel的margin的Top值。
解决方法
——————————————————————————————————
- 当一个控件高度设置为自动值时我们不能直接获取它的高度值,可以考虑间接方法
- 例如这样——上panel.Height = 大panel.Height - 上panel.margin.top - 上panel.margin.bottom;
- 尽管margin.top与margin.bottom值也许不对,但计算所得的height值一定是正确的。
- 利用控件的ActualHeight可以近似获取TextBlock的高度,条件是这个控件必须在尺寸上发生过变化,例如sizeChanged
- 可以参考https://www.cnblogs.com/maomiyouai/p/3557349.html
一点猜想~
——————————————————————————————————
- 那些高度设为Auto的控件的高度数值可以在其SizeChange事件发生时获取,这样利用全局变量就可以获取该控件的高度值
- 经过验证发现TextBox是可以的而TextBlock不行
巨人的肩膀
——————————————————————————————————
- 想要使后台用C#设置动态创建的控件高度为Auto可以这样弄
- 控件名.Height = Double.NaN;