【发布时间】:2015-05-23 01:42:21
【问题描述】:
我正在尝试使用 C#/WPF 创建一个也可以自行旋转的线性仪表。仪表的填充百分比及其方向取决于将通过数据绑定更新的 2 个参数。
我通过创建一个具有 2 列宽度的灵活网格来解决这个问题,这些列的宽度取决于一个参数(这将是仪表被填充的百分比;我的示例是随着时间的推移而变化)。我一直有一个黑色矩形填充 2 列;因此它的大小是恒定的;和一个仅填充第一列的橙色矩形;它的宽度取决于网格宽度并随时间变化。
当我尝试根据另一个参数旋转两个矩形时(在我的代码中它是一个 45 度的常数),这给我带来了麻烦。黑色和橙色矩形不再对齐(尽管它们保持平行)。只有当橙色矩形填满整个空间时,它们才会对齐。我试图将橙色矩形转换为黑色矩形,但它似乎不起作用。我什至不确定这是否是正确的方法。你们有没有办法修复此代码或建议另一种方法?
XAML:
<Grid x:Name="AdjustableGrid" Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition Height="1*" />
<RowDefinition Height="1*" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding ThrusterPower}" />
<ColumnDefinition Width="{Binding ThrusterPowerOpposite}" />
</Grid.ColumnDefinitions>
<Rectangle x:Name="GaugeBackground" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Stretch="Fill" Fill="Black" RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<RotateTransform Angle="45" />
</Rectangle.RenderTransform>
</Rectangle>
<Rectangle x:Name="Gauge" Grid.Row="1" Stretch="Fill" Fill="Orange" Margin="0,3,0,3" RenderTransformOrigin="0.5,0.5" >
<Rectangle.RenderTransform>
<RotateTransform Angle="45" />
</Rectangle.RenderTransform>
</Rectangle>
</Grid>
</Grid>
主要:
void dispatcherTimer_Tick(object sender, EventArgs e)
{
if (Tpower <= 100 && Tdir)
{
Tpower += dt;
}
else
{
Tdir = false;
}
if (Tpower >= 0 && !Tdir)
{
Tpower -= dt;
}
else
{
Tdir = true;
}
appData.UpdateThrusterPower(Tpower.ToString());
appData.UpdateThrusterPowerOpposite((100 - Tpower).ToString());
Point relative_distance = GaugeBackground.TranslatePoint(new Point(0, 0), Gauge);
Console.WriteLine(relative_distance);
TranslateTransform translateTransform1 = new TranslateTransform();
RotateTransform rotateTransform1 = new RotateTransform();
translateTransform1.X = relative_distance.X;
translateTransform1.Y = relative_distance.Y;
rotateTransform1.Angle = 45;
TransformGroup transformGroup1 = new TransformGroup();
transformGroup1.Children.Add(translateTransform1);
transformGroup1.Children.Add(rotateTransform1);
Gauge.RenderTransform = transformGroup1;
}
【问题讨论】:
-
将两个矩形放在一个公共容器中(例如另一个网格)并旋转它。