Xaml 使用MVVM和Prism以Xamarin格式旋转图像的最简单方法是什么

Xaml 使用MVVM和Prism以Xamarin格式旋转图像的最简单方法是什么,xaml,mvvm,xamarin.forms,rotation,prism,Xaml,Mvvm,Xamarin.forms,Rotation,Prism,例如,在使用ViewModel中的命令单击图像时,将图像旋转180度的最简单方法是什么?我用的是棱镜 由于点击背后也有一些逻辑,我尝试将其与手势重新登录器和事件处理程序混合使用,但这两者不能很好地协同工作。您可能会发现Dave Britch的行为库在这方面很有用。在他的博客中有这样的描述: 他的博客上的一个剪贴: 下面的代码示例演示如何使用EventHandlerBehavior和RotateAction类实现复合动画,该动画在X、Y和Z轴上同时旋转图像控件: 您可以在viewmodel中定义

例如,在使用ViewModel中的命令单击图像时,将图像旋转180度的最简单方法是什么?我用的是棱镜


由于点击背后也有一些逻辑,我尝试将其与手势重新登录器和事件处理程序混合使用,但这两者不能很好地协同工作。

您可能会发现Dave Britch的行为库在这方面很有用。在他的博客中有这样的描述:

他的博客上的一个剪贴:

下面的代码示例演示如何使用EventHandlerBehavior和RotateAction类实现复合动画,该动画在X、Y和Z轴上同时旋转图像控件:


您可以在viewmodel中定义新属性,以指示是否应旋转图像:

private bool\u;
公共图书馆
{
get=>\u showImageRotated;
set=>SetProperty(ref\u showImageRotated,value);
}
然后,在XAML代码中,您可以使用从布尔值到双精度的转换器将此属性绑定到
图像
元素的
旋转
属性

为此,请定义一个新的转换器:

public类BooleanToDegreesConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
返回(bool)值?180:0;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
App.xaml
文件中注册此新转换器:


然后使用它将图像的
旋转
属性绑定到viewmodel中定义的新布尔属性:


执行此操作后,图像将显示为旋转或正常,具体取决于属性值
ShowImageRotated

方法2:使用动画旋转图像 通过将以下内容添加到视图的代码中,可以使用动画旋转图像,而不是创建和使用转换器:

private YourViewModel\u viewModel;
...
受保护的覆盖无效OnBindingContextChanged()
{
base.OnBindingContextChanged();
如果(_viewModel!=null)
{
_viewModel.PropertyChanged-=OnViewModelPropertyChanged;
}
_viewModel=BindingContext作为您的viewModel;
如果(_viewModel!=null)
{
//订阅viewmodel属性更改以了解何时开始
//轮换
_viewModel.PropertyChanged+=OnViewModelPropertyChanged;
//设置初始旋转角度
YourImage.Rotation=\u viewModel.ShowImageRotated?180:0;
}
}
ViewModelPropertyChanged上的私有void(对象发送方,PropertyChangedEventArgs e)
{
开关(如PropertyName)
{
案例名称(YourViewModel.ShowImageRotated):
//如果属性ShowImageRotated发生更改,请启动动画
RotateImageWithAnimation();
打破
}
}
私有void RotateImageWithAnimation()
{
如果(_viewModel!=null)
{
var startAngle=_viewModel.ShowImageRotated?0:180;
var endAngle=_viewModel.ShowImageRotated?180:0;
新动画(v=>YourImage.Rotation=v,startAngle,endAngle).Commit(这是“图像旋转”);
}
}

我希望这有帮助

嘿,我尝试了你的第一种方法,因为我已经使用了这种布尔属性。我第一次尝试就成功了,我只需要最少的努力。非常感谢你!
<Image x:Name="image" Source="monkey.png" Opacity="0" VerticalOptions="CenterAndExpand" />
<Button Text="Run Animation">
    <Button.Behaviors>
        <behaviors:EventHandlerBehavior EventName="Clicked">
            <!-- Compound Animation -->
            <behaviors:RotateAction TargetObject="{x:Reference image}" 
                                    Duration="600000" 
                                    FinalAngle="110520" />
            <behaviors:RotateAction TargetObject="{x:Reference image}" 
                                    Duration="600000" 
                                    FinalAngle="90360" 
                                    Axis="X" />
            <behaviors:RotateAction TargetObject="{x:Reference image}" 
                                    Duration="600000" 
                                    FinalAngle="71640" 
                                    Axis="Y" />
        </behaviors:EventHandlerBehavior>
    </Button.Behaviors>
</Button>