0

我需要访问没有指定宽度的边框的实际宽度。有人告诉我,我不能在 WinRT 上这样做,所以我使用了 Florian-Gl 的代理(来自这里)。

问题是我需要在页面资源上创建该代理,如下所示:

<Page.Resources>
    <utils:ActualSizePropertyProxy Element="{Binding ElementName=noteBorder}" x:Name="proxy" />
</Page.Resources>

问题是我无法从资源中访问该 noteBorder 元素,但我可以访问page 本身的pageRoot 。

我想我可以使用 ElementName / Path 来访问 noteBorder。

但是有一些奇怪的东西:

结构类似于:

Page (pageRoot) > Grid > ListView > ListView.ItemTemplate > Grid > Border (noteBorder)

因此,如果我在边界的同一级别创建代理,它不会运行,但如果我将 ListView 更改为 ItemsControl,它将按预期运行和工作。

如果将它放在边框的同一级别,我将ElementName更改为pageRoot它至少会运行。

因此,如果我使用 ListView,如果我放置 noteBorder(即使我可以访问它),它也不会运行,但会在 ItemsControl 上工作,另一方面,如果我有pageRoot,它会以所有方式工作。

所以问题是:有没有办法从资源中访问noteBorder?或者也许是一种从另一个地方访问它但工作的方法:P

4

1 回答 1

0

您应该使用项目模板-当您到达 pageRoot) > Grid > ListView 或 Items Control

在结构中的这一点上,您位于您真正想要获得的元素,它是需要您尝试访问的边框的项目的容器。

您应该定义一个项目模板并通过绑定分配 ListView(或 ItemsControl)的 ItemTemplate 属性。

<ListView x:Name="myListView" DataContext="{Binding ToElementIfNotInheritedFromParent}" ItemsSource="{Binding ViewModelListBeingBoundTo}" ItemTemplate="{Binding Source={Static Resource MyCustomItemTemplate}}" />

MyCustomItemTemplate 类似于

 <DataTemplate x:Name="MyCustomItemTemplate">
   <Border x:Name="myBorder" >
     <StackPanel>
       <TextBlock Text="{Binding Path=Title}" />
       <TextBlock Text="{Binding Path=FirstProperty}"/>
       <TextBlock Text="{Binding Path=SecondProperty}"/>
     </StackPanel>
   </Border>
 </DataTemplate>

然后在您的 Codebehind 中(或者如果 ViewModel 使用后面的代码将 ListView 对象传递给 ViewModel)

DataTemplate dt = this.myListView.Items[indexOfChoice].ItemTemplate as DataTemplate;
Border b = dt.LoadContent() as Border;
int actualWidth = b.AcutalWidth 

OR

You can create a FindControl() method that runs recursively to extract the actual control within the border, for instance if you wanted to access one of the Textboxes. 

代码在这里: http ://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a612f5a6-e05e-4b68-a813-893eeda159cc

于 2012-11-21T13:32:15.723 回答