Windows runtime 从页面资源访问命名控件

Windows runtime 从页面资源访问命名控件,windows-runtime,winrt-xaml,Windows Runtime,Winrt Xaml,我需要访问没有指定宽度的边框的实际宽度。我被告知我不能在WinRT上这样做,所以我使用了Florian Gl(来自)的代理 问题是我需要在页面的资源上创建代理,如下所示: <Page.Resources> <utils:ActualSizePropertyProxy Element="{Binding ElementName=noteBorder}" x:Name="proxy" /> </Page.Resources> 因此,如果我在边界的同一级别

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

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

<Page.Resources>
    <utils:ActualSizePropertyProxy Element="{Binding ElementName=noteBorder}" x:Name="proxy" />
</Page.Resources>
因此,如果我在边界的同一级别创建代理,它将不会运行,但如果我将ListView更改为ItemsControl,它将按预期运行和工作

如果它与边框处于同一级别,我将ElementName更改为pageRoot,它至少会运行

因此,如果我在使用ListView时放置noteBorder(即使我有权访问它),它将不会运行,但会在ItemsControl上运行,另一方面,如果我有pageRoot,它会一直运行


所以问题是:有没有办法从资源中访问noteBorder?或者可以从其他地方访问它,但工作:P

您应该使用项目模板-- 到你到达的时候 pageRoot)>Grid>ListView或Items控件

在结构的这一点上,您正处于您真正想要获取的元素,该元素是需要您尝试访问的边框的项目的容器

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

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

谢谢您抽出时间。但这不是我要问的。我需要访问“资源”部分中的控件。我知道我可以通过代码选择实际宽度,但我更喜欢在XAML上这样做,这就是为什么我要问这个问题。我的边框在一个ItemTemplate中。好的,一旦你有了实际的宽度,你想做什么?是否根据边框的大小修改其他元素?是否修改边框元素本身?来自MSDN:虽然不能从XAML设置此属性,但可以在样式中基于其值创建触发器。有关触发器的更多信息:忘记ActualWidth的内容,只是想知道我是否可以从资源访问控件,仅此而已。是的,如果要访问的控件绑定到模板,则可以从资源文件访问控件的属性。通过这种方式,您可以通过访问模板的属性来访问控件的属性。可以通过资源文件修改运行时UI元素吗?是,在列表项的模板上使用可视状态管理器。
<ListView x:Name="myListView" DataContext="{Binding ToElementIfNotInheritedFromParent}" ItemsSource="{Binding ViewModelListBeingBoundTo}" ItemTemplate="{Binding Source={Static Resource 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>
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.