wpf “Canvas”方法在itemsControl中不起作用

uqxowvwt  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(182)

Canvas方法在canvas标签中总是工作的,但是当你试图在itemsControl中使用它们时,它们有时会停止工作。下面是一个示例:

<ItemsControl>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Click="Button_Click">Text</Button>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
   
    </ItemsControl>

xaml.cs文件

private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(Canvas.GetTop(sender as Button).ToString());
    }

这里的消息框返回南和我不知道的原因。也不能使用SetTop或left方法。你能帮忙吗?

编辑:****这里还有一件有趣的事情如果我给予一个元素命名,它确实有效,但我不希望这样,因为名称在itemTemplate中不可用。

代码如下:

<ItemsControl ItemsSource="{Binding SomeList}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
   <Button x:Name="Btn" Click="Button_Click">Text</Button>
   
    </ItemsControl>

xaml.cs文件

private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(Canvas.GetTop(Btn).ToString());
    }
qoefvg9y

qoefvg9y1#

要在ItemTemplate中定义元素的绝对位置,您应该将容器的Canvas.Top attached属性绑定到SomeList集合中对象类型的属性:

<ItemsControl ItemsSource="{Binding SomeList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Top" Value="{Binding Top}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Click="Button_Click">Text</Button>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

SomeList应该是IEnumerable<T>,其中类型T具有类型doubleTop属性:

public class Item
{
    public double Top { get; set; }
}

相关问题