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 解决了它。System.Windows.Interactivity如果您有Blend SDK,您可以使用。该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 方法需要注意两点。第一个是AssociatedObject,它被解析为 Ellipse,因为触发器在 xaml 中嵌套在它下面。第二件事是 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 回答