0

キャンバスがあり、指定された XY 位置にいくつかのポイントをバインドしたいと考えています。ただし、ItemsControl ではこれを実現できません。いくつかの解決策を見つけましたが、それらは Windows Phone 用ではないと思います。

私が使用しているXAMLは次のとおりです。

<ItemsControl ItemsSource="{Binding Path=Nodes}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left" Value="{Binding Path=XPos}" />
            <Setter Property="Canvas.Top" Value="{Binding Path=YPos}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

そして、「メンバー「ItemContainerStyle」が認識されていないか、アクセスできません」というメッセージが表示されます

そのようなバインディングを他の方法で行うにはどうすればよいですか? オブジェクトの名前と X/Y 値があり、バインドしたいのはある種の画鋲です

4

2 に答える 2

1

同じ問題が発生しましたが、代わりに TriggerAction を使用して解決しました。Blend SDKSystem.Windows.Interactivityをお持ちの場合は、を使用できます。dll は次の場所にあります。

c:\Program Files\Microsoft SDKs\Expression\Blend\Silverlight\v4.0\Libraries\
System.Windows.Interactivity.dll`

次に、以前の xaml コードを使用して、データ テンプレートを次のように設定できます。

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Ellipse Stroke="Red" Width="2" Height="2">
            <ia:Interaction.Triggers>
                <ia:EventTrigger EventName="Loaded">
                    <tr:SetCanvasPropertiesAction Left="{Binding X}" Top="{Binding Y}" />
                </ia:EventTrigger>
            </ia:Interaction.Triggers>
        </Ellipse>
    </DataTemplate>
</ItemsControl.ItemTemplate>

ia:Interaction前述のインタラクティブ dllのプレフィックスに注意してください。あなたはそれをロードします

xmlns:ia="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

xaml ファイルの先頭にあります。

tr プレフィックスは、次のような独自のクラスを含めるためのものです。

using System.Windows;
using System.Windows.Controls;
using System.Windows.Interactivity;
using System.Windows.Media;

namespace Presentation.Triggers {
    public class SetCanvasPropertiesAction : TriggerAction<DependencyObject> {
        public static readonly DependencyProperty LeftProperty =
            DependencyProperty.Register("Left", typeof(double), typeof(SetCanvasPropertiesAction), new PropertyMetadata(default(double)));

        public static readonly DependencyProperty TopProperty =
            DependencyProperty.Register("Top", typeof(double), typeof(SetCanvasPropertiesAction), new PropertyMetadata(default(double)));

        public double Top {
            get { return (double)GetValue(TopProperty); }
            set { SetValue(TopProperty, value); }
        }

        public double Left {
            get { return (double)GetValue(LeftProperty); }
            set { SetValue(LeftProperty, value); }
        }

        protected override void Invoke(object parameter) {
            UIElement presenter = (UIElement)VisualTreeHelper.GetParent(AssociatedObject);
            Canvas.SetLeft(presenter, Left);
            Canvas.SetTop(presenter, Top);
        }
    }
}

Invoke メソッドで注意すべき点が 2 つあります。1 つ目はAssociatedObject、トリガーが xaml でその下にネストされているため、Ellipse に解決されます。2 つ目は、楕円の親を取得する VisualTreeHelper です。これは、キャンバスの添付プロパティを設定する ContentPresenter です。

もっと複雑に見えるかもしれませんが、mvvm の他のすべてと同様に、xaml で再利用でき、コード ビハインド コードをどこにでもコピー アンド ペーストする必要はありません。

于 2012-08-30T11:45:10.760 に答える
0

最後に、foreach のみを使用して C# で実行しました。

foreach (var InsidePoints in _inside)
            {
                double left = InsidePoints.xaxis * Layer_3.Width;
                double top = InsidePoints.yaxis * Layer_3.Height;
                Image pinImage = new Image();
                pinImage.Name = InsidePoints.id.ToString();
                pinImage.Source = (ImageSource)new ImageSourceConverter().ConvertFromString("icons/inside_pin.png");
                pinImage.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(pinImage_Tap);
                //pinImage.Hold += new EventHandler<System.Windows.Input.GestureEventArgs>(pinImage_Hold);
                Layer_3.Children.Add(pinImage);
                Canvas.SetLeft(pinImage, left);
                Canvas.SetTop(pinImage, top);
            }
于 2012-08-28T11:24:11.740 に答える