MouseLeftButtonDown彩-カンヴァスを必要と過精度
質問
私への対応MouseLeftButtonDownのイベントを要素に付加されたコンポーネントのラインナップキャンバスに入力します。すべての色がクリックすると(のeventhandler火災off正しくない精度のマウスポインタです。につき、完全にサークルです。いでちょっときれいな色になりま許;も少なくとも1または2pixles許.要素をキャンバス上のも大きな輪っかのサイズの四半期の画面)でのサークルに自身のないものの、そStrokeWidthの一つひとつが1であるので薄い。
きスクリーンショットはこちら http://twitpic.com/1f2ci/full
最グラフィックアプリなこのマラガ大聖堂、ピカソの生誕のマウスピッキングしていきたいなと思っていますが、ユーザーが身近に体験です。
かで、もう少し許.
解決
あなたは代わりに自分のルートレイアウトオブジェクトののMouseLeftButtonDownイベントにフックアップ、およびこれを行うことにより、クリックの範囲にある要素を確認することができます:
List<UIElement> hits = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(Point, yourLayoutRootElement) as List<UIElement>;
http://msdn.microsoft.com/ EN-US /ライブラリ/ cc838402(VS.95).aspxのの
ポイントパラメータについて、あなたはMouseEventArgsパラメータeを使用することができ、このようにそのGetPositionメソッドを呼び出します:
Point p = e.GetPosition(null)
私はFindElementsInHostCoordinatesの代わりにHitTestを使用するかどうかを思い出すことができません。両方を試してみてください。
http://msdn.microsoft.com/en-us/library/ms608752。 ASPXする
あなたは偽tolerence効果を作成するために、マウス位置から4つのPointオブジェクトを作成し、すべての4点のためFindElementsInHostCoordinatesまたはHitTestのいずれかを呼び出すことができます。
他のヒント
あなたは、全体のサークルクリッカブルを作るために、透明色で円を埋めるためにしようとする場合があります...
それが失敗した場合、、あなたはまた、他の円と同じ場所にヘルパーの円を描くことができます。サークルの前景色を透明にし、円の周りより受け入れクリック可能な地域..
のために数ピクセル幅の広いブラシの太さを作りますこの情報がお役に立てば幸い!
私は...
(あなたは私が始めるのに役立つと)私はそれをやったと思いますは、まず、私の代わりに、各楕円のキャンバスに取り扱う移動イベントを移動しました。これは、OOPの観点から、良い面と悪いです。マウスイベント処理は、各穴(ホールの視覚的である楕円)までそれを設定するための孔パターンの責任であるとき、私の孔パターンのいずれかの消費者はautomacticallyこのfunctioanalityを取得するように、少なくとも、それが離れて抽象化されています。しかし、メインUIコードにそれを移動することで、私は今より高いレベルでの私のキャンバスのマウスイベントを扱っています。しかし、それはどちらかすべて悪いわけではないのです。我々は数日間この部分を議論することができます。
ポイントは、私は「誤差の範囲」を作成する方法を設計している、あるマウスでキャンバス上に何かを選ぶと、選択した楕円が属する穴を読み、その後、私は孔パターンを読み取ることができたときに穴が属する、と私の全体のUI(リストビュー、テキストボックス、GridViewのFO座標)ALL結合既存のXAMLによって更新されており、キャンバスは、キャンバスを再生成するために、既存の方法に一度のコールで更新されます。
正直に言うと、私は私が(もちろん、あまりにもあなたの助けと他の人と)このすべてを考え出したと信じてすることはできません。それは、この本のビジョンを持って、それがために来確認するために、このようなクールな感じです。
ここでの主なコードをチェックアウト:
void canvas1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
int ClickMargin = 2;
Point ClickedPoint = e.GetPosition(canvas1);
Point p1 = new Point(ClickedPoint.X - ClickMargin, ClickedPoint.Y - ClickMargin);
Point p2 = new Point(ClickedPoint.X - ClickMargin, ClickedPoint.Y + ClickMargin);
Point p3 = new Point(ClickedPoint.X + ClickMargin, ClickedPoint.Y + ClickMargin);
Point p4 = new Point(ClickedPoint.X + ClickMargin, ClickedPoint.Y - ClickMargin);
var PointPickList = new Collection<Point>();
PointPickList.Add(ClickedPoint);
PointPickList.Add(p1);
PointPickList.Add(p2);
PointPickList.Add(p3);
PointPickList.Add(p4);
foreach (Point p in PointPickList)
{
HitTestResult SelectedCanvasItem = System.Windows.Media.VisualTreeHelper.HitTest(canvas1, p);
if (SelectedCanvasItem.VisualHit.GetType() == typeof(Ellipse))
{
var SelectedEllipseTag = SelectedCanvasItem.VisualHit.GetValue(Ellipse.TagProperty);
if (SelectedEllipseTag!=null && SelectedEllipseTag.GetType().BaseType == typeof(Hole))
{
Hole SelectedHole = (Hole)SelectedEllipseTag;
SetActivePattern(SelectedHole.ParentPattern);
SelectedHole.ParentPattern.CurrentHole = SelectedHole;
}
}
}
}
う増加ストロークの厚さの楕円での調整が可能
このようにMouseLeftButtonDownイベント作品 例:に楕円タグ:
楕円 キャンバスに入力します。左="10"キャンバスに入力します。トップ="133"Height="24"Name="ellipse1"Width="23"ストローク="Red"MouseLeftButtonDown="ellipse1_MouseLeftButtonDown"ツールチップ="温もり"StrokeEndLineCap="Flat" StrokeThickness="12"
private void ellipse1_MouseLeftButtonDown(オブジェクト送MouseButtonEventArgs e) { 申請curAppます。電流curApp.Shutdown();}