如何解决如何使用LiveChart Gauge使LabelFormatter仅影响一个绑定值
我正在使用LiveChart Gauge制作仪表板程序。我想用%
符号显示值,但它也会更改我的“最大值”。
我如何只影响1个绑定值而不是所有绑定值?
XAML
<lvc:Gauge Grid.Row="2"
Grid.Column="0"
Margin="15"
Foreground="White"
GaugeActiveFill="Yellow"
From="0"
To="{Binding totalTargetQuantity}"
Value="{Binding ChartValue2}"
LabelFormatter="{Binding Formatter2}"/>
使用labelformatter之前
使用labelformatter后
我需要的结果
有人可以帮助我解决这个问题吗?
解决方法
与 Alexandr 相同的答案,但有修改:
使用 dnspy 下载并打开 LiveCharts.Wpf.dll 并找到以下行:this.MeasureTextBlock.Text = (this.LabelFormatter ?? func)(this.Value);
单击“编辑方法”并将该行替换为:this.MeasureTextBlock.Text = "% " + (this.LabelFormatter ?? func)(this.Value);
现在点击编译。
文件 -> 保存模块 -> LiveCharts.Wpf.dll
现在这个 dll 将显示如下仪表:
不幸的是,您不能这样做,因为LiveCharts Gauge不提供单独格式化标签的选项。您可以做的就是隐藏底部标签并提供您自己的标签,您必须手动将其放置,例如:
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<lvc:Gauge
x:Name="myGauge"
Margin="15,35"
LabelFormatter="{Binding Formatter2}"
LabelsVisibility="Collapsed"
StrokeThickness="2"
Value="9"
From="0"
To="10"
/>
<Label Content="{Binding ElementName=myGauge,Path=From}" FontSize="20" Margin="100,0" VerticalAlignment="Bottom"/>
<Label Content="{Binding ElementName=myGauge,Path=To}" FontSize="20" Margin="100,0" VerticalAlignment="Bottom" HorizontalAlignment="Right"/>
</Grid>
编辑: 或在ControlTemplate中添加标签:
<Window.Resources>
<Style x:Key="GaugeStyle1" TargetType="{x:Type lvc:Gauge}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type lvc:Gauge}">
<Border
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SnapsToDevicePixels="True">
<Grid>
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="3*" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label
Grid.Row="2"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Content="{Binding ElementName=myGauge,Path=From}"
FontSize="{TemplateBinding FontSize}" />
<Label
Grid.Row="2"
Grid.Column="2"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Content="{Binding ElementName=myGauge,Path=To}"
FontSize="{TemplateBinding FontSize}" />
</Grid>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<lvc:Gauge
x:Name="myGauge"
Margin="15"
FontSize="30"
LabelFormatter="{Binding Formatter2}"
LabelsVisibility="Collapsed"
StrokeThickness="2"
Style="{DynamicResource GaugeStyle1}"
Value="9"
From="0"
To="10" />
</Grid>
,
首先,没有办法“开箱即用”。因此,每种解决方案都是“特殊的”,甚至看起来像拐杖。
不确定我应该按什么顺序放置它们。
-
隐藏原始的Gauge标签,并创建特殊的UserControl / Adorner以将它们覆盖在您喜欢的文本上
-
下载LiveCharts的源代码,在“ WpfView”解决方案中找到Gauge.cs。找私人 Update()方法。 您正在寻找下一行:
LeftLabel.Text = (LabelFormatter ?? defFormatter)(From); RightLabel.Text = (LabelFormatter ?? defFormatter)(To);
克隆量规,或者为其中的每个标签引入单独的LabelFormatter。
想不出别的东西。您要么“伪造”原始标签,要么更改源,因为无法覆盖此行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。