C# 如何将TranslateTransform应用于现有的“儿童”

C# 如何将TranslateTransform应用于现有的“儿童”,c#,wpf,xaml,C#,Wpf,Xaml,我重写这个问题是为了让人们更清楚地知道我做了什么,试图做什么等等 我参与了一个项目,我试图做一些视觉显示。一个显示器是一个拨号盘,我几乎从这个链接获得了全部代码 我现在正试着做一个垂直测量仪,有点像下面。 现在,我修改了拨号代码,使背景刻度等一切正常 我遇到的问题是移动指示器 拨号代码在xaml中定义拨号,如下所示 <Path x:Name="Pointer" Stroke="#FFE91C1C" StrokeThickness="2" Width="{TemplateBind

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

我参与了一个项目,我试图做一些视觉显示。一个显示器是一个拨号盘,我几乎从这个链接获得了全部代码

我现在正试着做一个垂直测量仪,有点像下面。

现在,我修改了拨号代码,使背景刻度等一切正常

我遇到的问题是移动指示器

拨号代码在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}}">
TransformGroup tg = pointer.RenderTransform as TransformGroup;
RotateTransform rt = tg.Children[0] as RotateTransform;
rt.Angle = angleValue;
<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>
现在,由于我只是垂直上下移动指示器,我相信我需要一个TranslateTransform。在谢里登的帮助下。我将我的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}}">
TransformGroup tg = pointer.RenderTransform as TransformGroup;
RotateTransform rt = tg.Children[0] as RotateTransform;
rt.Angle = angleValue;
<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>
但是,此错误导致无法设置对象“System.Windows.Media.TranslateTransform”的属性,因为它处于只读状态

Sheridan再次建议我尝试分配新对象并替换旧对象。但是,我尝试的方法要么抛出错误,要么没有效果。

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

<Path ... >
    <Path.RenderTransform>
        <TranslateTransform />
    </Path.RenderTransform>
</Path>
同样,如果尝试将此属性值强制转换为TransformGroup而不设置,则会得到空值:


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

WPF


很明显,RenderTransform值是由绑定转换器创建的。您不应该在代码隐藏中操纵该值。要么直接在XAML中创建转换,要么修改绑定,以便转换器可以直接创建所需的值。当前有一个PointerLength视图模型属性。如何将其转换为TranslateTransform?你到底想实现什么?上面的例子来自一个刻度盘,所以当值改变时,指针围绕一个设定点旋转,指向新值,就像汽车中的speedo一样,我想做的是创建一个显示,指针在x轴上上下移动,指向该值。因此,我试图将rotatetransform更改为translatetransform,尽管我一直在TransformGroup tg=pointer.RenderTransform as TransformGroup;上获得tg null,但我的尝试至今仍在进行;。我知道我需要更改xaml,我不知道该做什么。您好,我实现了您的建议,现在tg明显不再为null,TransformGroup tg=pointer.RenderTransform为TransformGroup;TranslateTransform rt=tg。子项[0]作为TranslateTransform;rt.X=5;当我尝试设置rt.X时,im getting error无法在对象“System.Windows.Media.TranslateTransform”上设置属性,因为它处于只读状态。该错误只是意味着不要尝试操作现有转换,而是创建一个新的转换并将其应用于pointer.RenderTransform属性。我为我的愚蠢行为提前道歉。但你的意思是什么。TransformGroup tg=pointer.RenderTransform作为TransformGroup;TranslateTransform rt=新的TranslateTransform;rt.Y=50;tg.Children.Addrt;这给了我一个错误,不是说我已经看过了,只是想确保我的思路正确。你的错误告诉你你的TranslateTransform是只读的。这意味着您不能更改其值。因此,与其尝试更改其值,不如在必要时使用只读TranslateTransform中的值创建一个新的TranslateTransform,然后用新对象替换只读对象;
TransformGroup tg = pointer.RenderTransform as TransformGroup;
// tg is a TransformGroup 
<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>
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();
    }
}