将Win8商店应用程序教程改编为WPF
本文关键字:WPF 教程 应用程序 Win8 | 更新日期: 2023-09-27 17:50:58
我遵循这个教程,解释了如何在Visual Studio中使用XAML/c#创建Dial。问题是这个教程是针对windows 8商店应用的。
知道了这一点,我仍然尝试在支持以前操作系统的WPF应用程序中使用本教程。
我遇到了一些兼容性问题:
-
ManipulationMode="All"
不存在,因为教程的作者为我使用它。它只作为Manipulation.ManipulationMode="All"
存在,这给了我一个错误"操作在指定元素上不活跃"。怎么解呢? - 作者在
grid
元素上设置了ManipulationDelta
属性,我一开始没有问题……直到我意识到由VS创建的作者的事件/动作代码隐藏使用ManipulationDeltaRoutedEventArgs e
而不是ManipulationDeltaEventArgs e
,这是在我的代码隐藏文件中使用。这意味着我不能使用Position
属性(e.Position
)来轻松获取用户控件上的鼠标位置。有什么替代方案吗?我不认为它可以被支持,因为它被声明为只支持Win8… - 在mvvm风格的应用程序中,代码隐藏操作将在
ViewModel
中设置。我将如何"绑定"的行动代码到一个元素的ManipulationDelta
属性?
提前感谢!
注;我和作者的VS版本都是2012,所以这不是问题。
更新:下面是部分完成的代码:
XAML://Manipulation.ManipulationMode="All" => ERROR 'Manipulation is not active on the specified element'
<Grid Manipulation.ManipulationMode="All" ManipulationDelta="Grid_ManipulationDelta_1">
<Ellipse Fill="#FF7171E6" Margin="30"/>
<Grid>
<Grid.RenderTransform>
<RotateTransform CenterX="225" CenterY="225" Angle="{Binding Angle}"/>
</Grid.RenderTransform>
<Ellipse Fill="White" Height="100" VerticalAlignment="Top" Margin="50" Width="100"/>
</Grid>
</Grid>
后台代码:
public partial class dial : UserControl, INotifyPropertyChanged
{
private int m_Amount;
public int Amount {...}
private double m_Angle;
public double Angle {...}
public dial()
{
InitializeComponent();
this.DataContext = this;
}
private void Grid_ManipulationDelta_1(object sender, ManipulationDeltaEventArgs e)
{
this.Angle = GetAngle(e.Position, this.RenderSize); //e.Position doesn't exist in ManipulationDeltaEventArgs...
this.Amount = (int)(this.Angle / 360 * 100);
}
public enum Quadrants : int { nw = 2, ne = 1, sw = 4, se = 3 }
private double GetAngle(Point touchPoint, Size circleSize)
{
var _X = touchPoint.X - (circleSize.Width / 2d);
var _Y = circleSize.Height - touchPoint.Y - (circleSize.Height / 2d);
var _Hypot = Math.Sqrt(_X * _X + _Y * _Y);
var _Value = Math.Asin(_Y / _Hypot) * 180 / Math.PI;
var _Quadrant = (_X >= 0) ?
(_Y >= 0) ? Quadrants.ne : Quadrants.se :
(_Y >= 0) ? Quadrants.nw : Quadrants.sw;
switch (_Quadrant)
{
case Quadrants.ne: _Value = 090 - _Value; break;
case Quadrants.nw: _Value = 270 + _Value; break;
case Quadrants.se: _Value = 090 - _Value; break;
case Quadrants.sw: _Value = 270 + _Value; break;
}
return _Value;
}
public event PropertyChangedEventHandler PropertyChanged;
}
- 在WPF中,你可以使用IsManipulationEnabled="true"来启用操作。不需要像Windows商店应用程序那样使用ManipulationMode="All"。
- 您可以尝试使用mouse . getposition (this)来获取当前鼠标位置