如何在现有的“儿童”上应用TranslateTransform

时间:2014-06-19 15:03:05

标签: c# wpf xaml

我正在重写这个问题,试图让人们更清楚地知道我做了什么,试图做等等。

我参与了一个项目,我试图进行一些视觉显示。一个显示器是一个表盘,我几乎从这个链接获得了整个代码。

https://github.com/mesta1/WPF-Circular-Gauge/blob/master/CircularGauge/CircularGaugeDemoWPF/CircularGaugeDemoWPF.csproj

我现在正试图做一个垂直测量,有点像下面。 enter image description here

现在我修改了拨号代码,因此背景比例等都可以。

我所拥有的问题是移动指标。

拨号代码定义了xaml中的拨号,如下所示。

<Path x:Name="Pointer" Stroke="#FFE91C1C" StrokeThickness="2" 
    Width="{TemplateBinding PointerLength}"  
    Height="{TemplateBinding PointerThickness}" 
    HorizontalAlignment="Center" 
    Data="M1,1 L1,10 L156,6 z" Stretch="Fill" 
    RenderTransformOrigin="0,0.5" 
    RenderTransform="{Binding RelativeSource=
    {RelativeSource TemplatedParent}, Path=PointerLength, 
    Converter={StaticResource pointerCenterConverter}}">

并在.cs文件中控制其位置,如下所示。

TransformGroup tg = pointer.RenderTransform as TransformGroup;
RotateTransform rt = tg.Children[0] as RotateTransform;
rt.Angle = angleValue;

现在因为我只是垂直向上和向下移动指示器,我相信我需要一个TranslateTransform。在Sheridan的帮助下。我已将我的xaml更改为以下内容。

<Path x:Name="Pointer" Stroke="#FFE91C1C" StrokeThickness="2" 
    VerticalAlignment="Bottom"
    Data="M 0,0 L 16,-5 L16,5 L0,0 z">
        <Path.RenderTransform>
            <TransformGroup>
                <TranslateTransform/>
             </TransformGroup>
         </Path.RenderTransform>

现在我正在努力解决我的.cs需要编辑的问题。目前正在玩

TransformGroup tg = pointer.RenderTransform as TransformGroup;
TranslateTransform rt = tg.Children[0] as TranslateTransform;
rt.Y = -10;

然而抛出错误“无法在对象'System.Windows.Media.TranslateTransform'上设置属性,因为它处于只读状态。”

谢丽丹再次建议我尝试分配一个新对象并替换旧对象。但我似乎试图抛出错误或没有效果。

2 个答案:

答案 0 :(得分:0)

要转换UIElement,首先需要在其上应用转换元素:

<Path ... >
    <Path.RenderTransform>
        <TranslateTransform />
    </Path.RenderTransform>
</Path>

如果您使用TranslateTransform作为RenderTransform属性值,则无法将其转换为RotateTransform。您可以在MSDN上的UIElement.RenderTransform Property页面上找到更多信息。

TransformGroup tg = pointer.RenderTransform as TransformGroup;
// tg == null

同样,如果您尝试将此属性值转换为TransformGroup而未设置该值,则获得null值:

<Path ... >
    <Path.RenderTransform>
        <TransformGroup>
            <ScaleTransform />
            <RotateTransform />
        </TransformGroup>
    </Path.RenderTransform>
</Path>

您可以在MSDN上的TransformGroup Class页面上找到更多信息。

...

TransformGroup tg = pointer.RenderTransform as TransformGroup;
// tg is a TransformGroup 

答案 1 :(得分:0)

请找到动态变换的简单工作代码。我希望它能帮助你

WPF

<Window x:Class="WPFAnimationSample2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
    <Ellipse x:Name="animateEllipse" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="61" Margin="99,78,0,0" Stroke="Black" VerticalAlignment="Top" Width="81" RenderTransformOrigin="0.5,0.5" >
        <Ellipse.RenderTransform>
            <TransformGroup>
                <ScaleTransform/>
                <SkewTransform/>
                <RotateTransform/>
                <TranslateTransform  X="1" Y="1"/>
            </TransformGroup>
        </Ellipse.RenderTransform>
    </Ellipse>
    <Button Content="Button" HorizontalAlignment="Left" Margin="180,256,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>


</Grid>

C#

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    void checkAnimation()
    {

        TransformGroup tg = animateEllipse.RenderTransform as TransformGroup;
       TranslateTransform rt = tg.Children[3] as TranslateTransform;
       rt.X = rt.X+100;
       rt.Y = 100;
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        checkAnimation();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        checkAnimation();
    }
}