精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。
最近WPF开发仪表盘,用代码修改了最大最小值,仪表盘控件不实时刷新,刻度没变化,就出现了问题:WPF控件不能实时刷新显示,后来研究了下,找到了WPF控件不能实时刷新显示替代解决办法。
仪表盘的布局xaml如下:
<my:Gauge Grid.Row="0" Width="180" Height="180" Name="deviceDashboard1"
HorizontalAlignment="Left" VerticalAlignment="Top" Radius="90" PointerLength="45"
PointerCapRadius="12" PointerThickness ="8" ImageSource="/Imgs/windowslogo.png"
ImageSize="20,20" ImageOffset="-20" RangeIndicatorRadius="65"
ScaleRadius="58" ScaleStartAngle="120" ScaleSweepAngle="300"
ScaleLabelRadius="40" ScaleLabelSize="40,20" ScaleLabelFontSize="8"
ScaleLabelForeground="LightGray" RangeIndicatorThickness="8"
RangeIndicatorLightRadius="5" RangeIndicatorLightOffset="50"
DialTextOffset="25" DialText="Black" DialTextColor="Black"
MinValue="0" MaxValue="240" MajorDivisionsCount="10"
MinorDivisionsCount="2" OptimalRangeStartValue="80"
OptimalRangeEndValue="120" DangerRangeStartValue="180"
CurrentValue="0"
MajorTickSize="10,3"
MinorTickSize="3,1"
MajorTickColor="LightGray"
MinorTickColor="LightGray"
GaugeBackgroundColor="Black"
/>
上面是在xaml里指定好的,我用控件名设置属性后,不能实时刷新,看不到属性新值的表现。Winform里有Invalidate或Refresh,我试了三个函数调用都不行:InvalidateArrange、InvalidateVisual和InvalidateMeasure。
没办法,只能用动态添加控件办法,先Children.Clear(),再Children.Add,新控件肯定会刷新,这样就避免了问题。
不过,这是替代办法,应该不是WPF的正解,在MSDN里原话:“布局更新一般在布局系统) 确定的一次异步 (。 元素可能不会立即反映对影响元素大小 (调整的属性的更改,例如 Width) ”。我用的控件不是WPF的控件,可能在布局支持上不太完美吧。
另外,布局方面的知识点:“如果渲染大小已更改或设置了RenderingInvalidated标志,则UIElement调用UIElement.Arrange()。在控件中重写的OnRender()。在那里,您可以放置渲染说明”。意思和上段类似,但是RenderingInvalidated的资料很少。
如果谁有更好的方法,欢迎联系。