XAML / C#を使用してVisualStudioでダイヤルを作成する方法を説明するこのチュートリアルに従っています。問題は、チュートリアルがWindows8ストアアプリを対象としていることです。
それを知って、私はまだ以前のOSもサポートするWPFアプリケーションでこのチュートリアルを使用しようとしました。
私はいくつかの互換性の問題に遭遇しました:
ManipulationMode="All"
チュートリアルの作者が私のためにそれを使用しているので、存在しません。Manipulation.ManipulationMode="All"
「指定された要素で操作がアクティブではありません」というエラーが発生する場合にのみ存在します。どうすれば解決できますか?- 作成者は、最初は問題がなかっ
ManipulationDelta
た要素にプロパティを設定しました...作成者のイベント/アクションコードビハインドが、コードビハインドファイルで使用されているものではなく、 VSで作成されていることに気付くまで。これは、プロパティ()を使用してユーザーコントロール上のマウスの位置を簡単に取得できないことを意味します。それに代わるものは何でしょうか?Win8としてのみ宣言されているため、サポートできないと思います...grid
ManipulationDeltaRoutedEventArgs e
ManipulationDeltaEventArgs e
Position
e.Position
- MVVMスタイルのアプリケーションでは、コードビハインドアクションはで設定されます
ViewModel
。ManipulationDelta
そのアクションコードを要素のプロパティに「バインド」するにはどうすればよいですか?
前もって感謝します!
PS; 私と作者のバージョンの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;
}