【问题标题】:Accessing Property that has a setter inside a template访问在模板中具有设置器的属性
【发布时间】:2014-02-16 13:43:09
【问题描述】:

我有一个画布,它采用多种类型的对象并将它们显示在特定位置。 大多数对象都有一个由“Setter”设置的 Location 属性,效果很好。

我有一个复杂的对象——由 4 个位图组装而成。 我希望能够使用 canvas.top 和 canvas.left 设置每个位图位置,但不是使用 setter 中的位置(他们没有),而是使用他们自己的 location 属性。

这里是代码。

我的问题是 WPF 完全忽略了我的 canvas.top 和 canvas.left 分配,即使我使用数字而不是绑定 - 也没有任何反应。

可能是什么问题?

这是我当前的代码。 ComplexBitmap 在 0,0 中绘制自身,而不是预期的位置。

<ItemsControl Name="itemtest"  ItemsSource="{Binding}" Height="576" Background="#FFB0B4B4" Width="704">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <local2:DragCanvas x:Name="canvas1" AllowDragging="true" AllowDragOutOfView="False"  Width="704" Height="576" Background="#3AC2DED4"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemContainerStyle>
                        <Style TargetType="ContentPresenter">
                            <Setter Property="Canvas.Left" Value="{Binding Path=Location.X, Mode=TwoWay}"/>
                            <Setter Property="Canvas.Top" Value="{Binding Path=Location.Y,  Mode=TwoWay}"/>
                            <Setter Property ="Visibility" Value="{Binding Path= ShowOnDemo, Converter={StaticResource BooleanToVisibilityConverter}}" />
                        </Style>
                    </ItemsControl.ItemContainerStyle>
                    <ItemsControl.ItemTemplateSelector>
                        <local:CustomTemplateSelector>
                            .
                            <local:CustomTemplateSelector.BitmapTemplate>
                                <DataTemplate>
                                    <StackPanel>
                                        <Image Source="{Binding Path=Bitmaps/myBitmap}" Canvas.Left="{Binding Path=Location.X, Mode=TwoWay}" Canvas.Top="{Binding Path=Location.Y, Mode=TwoWay}" />
                                    </StackPanel>
                               </DataTemplate>
                                </local:CustomTemplateSelector.BitmapTemplate>
                            .
                            <local:CustomTemplateSelector.ComplexBitmapTemplate >
                                <DataTemplate>
                                    <Grid>
                                        <StackPanel>
                                            <Image Source="{Binding Path=TopLeftBitmapObj.myBitmap}" Canvas.Left="400" Canvas.Top="400" /> <-- Here I've tried to bind to another property, but even the 400 didn't work --> 
                                       </StackPanel>
                                       <-- Here comes 3 more bitmaps --> 
                                    </Grid>
                                </DataTemplate>
                            </local:CustomTemplateSelector.ComplexBitmapTemplate>
                        </local:CustomTemplateSelector>
                    </ItemsControl.ItemTemplateSelector>
                </ItemsControl>

【问题讨论】:

  • 听起来您的物品可能不会立即放在画布上?你能贴一张从 Snoop 截取的可视化树的屏幕截图吗?
  • 还要仔细检查您的源绑定路径。
  • @raptor - 来源可以,如图片所示,但在 0,0 而不是 400,400....
  • HighCore 的 +1,似乎 Image 不是画布的直接子级。您是否尝试过使用 StackPanelDatagrid 的 Canvas 绑定

标签: wpf


【解决方案1】:

请检查以下内容:

  1. 在调试模式下在 Visual Studio 中运行并检查路径错误(如 Raptor 建议的那样)
  2. 删除 来自内容演示者的样式(如您所说,ComplexBitmap 不包含 Location 属性...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多