我想在 Canvas 上绘制 listbox 项目,将它们放在某个地方,然后移动它们,在以下非常好的例子中找到灵感Brewer Floating Content . 但是我不想从博客中复制这个特定的例子 .

因此,我尝试使用 Canvaslistbox 上绘制项目,但是再次失败,尽管在WPF中这很容易 .

XAML代码是:

<UserControl.Resources>
    <DataTemplate x:Key="ThingTemplate" x:DataType="local:Thing">
        <Border Width="150" BorderBrush="#FF9B3333" BorderThickness="2"
                ManipulationMode="TranslateX, TranslateY, TranslateInertia"
                ManipulationDelta="Border_ManipulationDelta">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition Height="auto" />
                </Grid.RowDefinitions>
                <Border Background="#FF9B3333" Grid.Row="1">
                    <TextBlock Text="{Binding Comment}" HorizontalAlignment="Center"
                        VerticalAlignment="Center" TextWrapping="WrapWholeWords" Foreground="Black" Padding="4" />
                </Border>
            </Grid>
        </Border>
    </DataTemplate>    
</UserControl.Resources>

<Grid>
    <ListBox x:Name="ThingCanvas" Grid.Row="1" ItemTemplate="{StaticResource ThingTemplate}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>
</Grid>

和源代码隐藏:

public sealed partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        this.InitializeComponent();
        for (var i = 0; i < 4; i++)
        {
            var newThing = new Thing() { Comment = "Item" + i.ToString() };
            ThingCanvas.Items.Add(newThing);
        }
    }

    private void Border_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        var left = Canvas.GetLeft(this) + e.Delta.Translation.X;
        var top = Canvas.GetTop(this) + e.Delta.Translation.Y;
        Canvas.SetLeft(this, left);
        Canvas.SetTop(this, top);
    }
}

public class Thing
    {
        public string ImagePath { get; set; }
        public string Comment { get; set; }
    }

奇怪的是 Canvas 无法访问 IsItemsHost 属性,这是在WPF中设置的 .

同样阻碍的是样式设置器无法在UWP中进行数据绑定,因此无法绑定 Canvas.LeftCanvas.Top .

感谢您帮助我推进这一主题 .

RudiAcitivity