【问题标题】:Creating Rotating Linear Gauge using C#/WPF使用 C#/WPF 创建旋转线性规
【发布时间】: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;
        }

【问题讨论】:

  • 将两个矩形放在一个公共容器中(例如另一个网格)并旋转它。

标签: c# wpf xaml


【解决方案1】:

ProgressBar 可能是一个更好的主意,它是专门为这类事情设计的。这是一个非常简单的带有边框的...触发器/故事板动画代码仅用于说明目的,可以剥离:

<Border Width="200" Height="50" BorderBrush="Black" BorderThickness="5" HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5">
    <Border.RenderTransform>
        <RotateTransform x:Name="theTransform" Angle="0" />
    </Border.RenderTransform>
    <Border.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation
                        Storyboard.TargetName="theTransform" Storyboard.TargetProperty="Angle" 
                        From="0" To="360" Duration="0:0:5" RepeatBehavior="Forever" />
                    <DoubleAnimation
                        Storyboard.TargetName="theProgressBar" Storyboard.TargetProperty="Value" 
                        From="0" To="100" Duration="0:0:5" RepeatBehavior="Forever" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Border.Triggers>
    <ProgressBar Name="theProgressBar" Minimum="0" Maximum="100" Value="0" Foreground="Orange" Background="DarkGray" BorderThickness="0" />
</Border>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多