私は、アプリケーション用の 3D インターフェースのようなものを作成する任務を負っています。オプションを検討した結果、Viewport2DVisual3D が最も理解しやすく、ゲーム デザインのバックグラウンドで使用するのに最も簡単であると判断しました (マトリックス変換などには慣れています)。
これまでのところ、画面上に半円形の「ステージ」のようなパターンで表示されるボタンの素敵なリストがあります。これは良いスタートです。今、私がやりたいことは、カルーセルがユーザー入力で回転できるようにすることです。今のところ、クリックするとボタンが回転して中央に表示されるようにしますが、最終的には操作データを使用して画面をスワイプできるようにします。
私が抱えている問題は、各 V2DV3D の Transform プロパティを、各 Button コントロールを裏付けるデータにバインドすることです。コード ビハインドでこれを行う方法がわかりません。変換をプログラムでビルドするには、コード ビハインドにする必要があります。
そのまま、このように値を割り当てます (vv
はViewport2DVisual3D
オブジェクトです):
vv.SetValue(Viewport2DVisual3D.TransformProperty, item.Transform);
を実装item
する a はどこにありますか:CarouselItem
INotifyPropertyChanged
public class CarouselItem : INotifyPropertyChanged
{
[...]
public Transform3DGroup Transform
{
get { return _transform; }
set { _transform = value; OnPropertyChanged("Transform"); }
}
[...]
private void Recalc()
{
Transform3D rotate = new RotateTransform3D(new
AxisAngleRotation3D(CarouselBrowser.Up, angle));
Transform3D translate = new TranslateTransform3D(0, 0,
CarouselBrowser.Radius);
Transform3D translate2 = new TranslateTransform3D(
CarouselBrowser.Focus);
Transform3DGroup tGroup = new Transform3DGroup();
tGroup.Children.Add(translate);
tGroup.Children.Add(rotate);
tGroup.Children.Add(translate2);
Transform = tGroup;
}
[...]
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
this.VerifyPropertyName(propertyName);
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
/// <summary>
/// Warns the developer if this object does not have
/// a public property with the specified name. This
/// method does not exist in a Release build.
/// </summary>
[Conditional("DEBUG")]
[DebuggerStepThrough]
public void VerifyPropertyName(string propertyName)
{
// Verify that the property name matches a real,
// public, instance property on this object.
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
{
string msg = "Invalid property name: " + propertyName;
if (this.ThrowOnInvalidPropertyName)
throw new Exception(msg);
else
Debug.Fail(msg);
}
}
/// <summary>
/// Returns whether an exception is thrown, or if a Debug.Fail() is used
/// when an invalid property name is passed to the VerifyPropertyName method.
/// The default value is false, but subclasses used by unit tests might
/// override this property's getter to return true.
/// </summary>
protected virtual bool ThrowOnInvalidPropertyName { get; private set; }
[...]
}
(一部のコードは省略されています。Recalc
が変更されたときに呼び出されangle
、新しい値は古い値とは異なります)
したがって、最初の「バインディング」は正常に機能し、ボタンは最初の変換を行いますが、Transform をさらに変更しても変更はありません。Transform プロパティ変更イベントのイベント ハンドラーにはサブスクライバーがありません。CarouselItem および V2DV3D とのバインディング/関係を変更して、それらをリンクさせるにはどうすればよいですか? オブジェクト全体をバインドできる V2DV3D の DataContext または同様のプロパティはないようです。