C# 使用画布在ItemsControl上定位XAMLUI元素

C# 使用画布在ItemsControl上定位XAMLUI元素,c#,xaml,canvas,mvvm,win-universal-app,C#,Xaml,Canvas,Mvvm,Win Universal App,我正在构建一个Windows通用应用程序,需要在画布上放置一些元素。因为我想使用这种MVVM样式,所以我读到应该使用ItemsControl。问题是,我找到的所有解决方案都是针对WPF或Silverlight的,不适用于Windows Universal。它们出现在画布上,但它们一直将自己定位在左上角 XAML: 视图模型和模型: class MyItemViewModel { ObservableCollection<MyItem> _myItems; publ

我正在构建一个Windows通用应用程序,需要在画布上放置一些元素。因为我想使用这种MVVM样式,所以我读到应该使用ItemsControl。问题是,我找到的所有解决方案都是针对WPF或Silverlight的,不适用于Windows Universal。它们出现在画布上,但它们一直将自己定位在左上角

XAML:

视图模型和模型:

class MyItemViewModel
{
    ObservableCollection<MyItem> _myItems;

    public MyItemViewModel()
    {
        _myItems = new ObservableCollection<MyItem>();
        _myItems.Add(new MyItem(10, 10, "First TextBlock"));
        _myItems.Add(new MyItem(200, 400, "2nd TextBlock"));
        _myItems.Add(new MyItem(400, 200, "The Third TextBlock"));
    }

    public ObservableCollection<MyItem> MyItems
    {
        get { return _myItems; }
        set { _myItems = value; }
    }
}

public class MyItem
{
    public MyItem(double left, double top, string text)
    {
        Left = left;
        Top = top;
        Text = text;
    }

    public double Left { get; set; }
    public double Top { get; set; }
    public string Text { get; set; }
}
类MyItemViewModel
{
可观察的收集项目;
公共MyItemViewModel()
{
_myItems=新的ObservableCollection();
_添加(新的MyItem(10,10,“第一个文本块”);
_添加(新的MyItem(200400,“第二个文本块”);
_添加(新的MyItem(400200,“第三个文本块”);
}
公共可观测集合MyItems
{
获取{return\u myItems;}
设置{u myItems=value;}
}
}
公共类MyItem
{
公共MyItem(双左、双顶部、字符串文本)
{
左=左;
顶部=顶部;
文本=文本;
}
公共双左{get;set;}
公共双顶部{get;set;}
公共字符串文本{get;set;}
}

使用
框架元素
作为
目标类型

<ItemsControl.ItemContainerStyle>
    <Style TargetType="FrameworkElement">
         <Setter Property="Canvas.Left" Value="{Binding Left}" />
         <Setter Property="Canvas.Top" Value="{Binding Top}" />
    </Style>
</ItemsControl.ItemContainerStyle>

使用
框架元素
作为
目标类型

<ItemsControl.ItemContainerStyle>
    <Style TargetType="FrameworkElement">
         <Setter Property="Canvas.Left" Value="{Binding Left}" />
         <Setter Property="Canvas.Top" Value="{Binding Top}" />
    </Style>
</ItemsControl.ItemContainerStyle>


我不同意可能的副本。我看到了这些项目,但它们没有例外。他们只是停留在左上角。我认为你的
TargetType
是错误的。请尝试以下操作:
TargetType=“{x:Type UIElement}”
。如果不起作用,请尝试完全删除
TargetType
属性。经过短暂搜索后,Windows Universal apps可能不支持这种样式的绑定类型(问题实际上可追溯到WinRT和Silverlight之前)。看,和。可能的副本我不同意。我看到了这些项目,但它们没有例外。他们只是停留在左上角。我认为你的
TargetType
是错误的。请尝试以下操作:
TargetType=“{x:Type UIElement}”
。如果不起作用,请尝试完全删除
TargetType
属性。经过短暂搜索后,Windows Universal apps可能不支持这种样式的绑定类型(问题实际上可追溯到WinRT和Silverlight之前)。看,还有。如果你不使用它,它就不会编译了。我还以为你在使用WPF呢。尝试添加FrameworkElement的目标类型。如果您不使用它,它不会被编译。我还以为您在使用WPF呢。尝试添加FrameworkElement的目标类型。
<ItemsControl.ItemContainerStyle>
    <Style TargetType="FrameworkElement">
         <Setter Property="Canvas.Left" Value="{Binding Left}" />
         <Setter Property="Canvas.Top" Value="{Binding Top}" />
    </Style>
</ItemsControl.ItemContainerStyle>