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